题解 | #简单的序列#
简单的序列
https://ac.nowcoder.com/acm/contest/11193/B
题目大意
给你一个数x,让你将他分成k个质数的和,要求看最小
解题思路
根据哥德巴赫猜想,当x偶数的时可以分成两个质数的和
那么如果x为偶数,就枚举其中一个质数,判断另一个是否为质数,如果是奇数,那么分出一个1再处理
code
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 10000100
#define NN 1000010
using namespace std;
ll T,x,w,x1,x2,x3,pp,nx[N],p[N],prime[NN];
void work(ll n)
{
w=1;
prime[1]=1;
for(ll i=2;i<=n;++i){
if(!p[i])prime[++w]=i;
nx[i]=prime[w];
for(ll j=2;j<=w&&i*prime[j]<=n;++j){
p[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
}
return;
}
int main()
{
work(10000000);
scanf("%lld",&T);
while(T--){
scanf("%lld",&x);
if(!x){
printf("1\n0 = 0\n");
continue;
}
else if(!p[x]){
printf("1\n%lld = %lld\n",x,x);
continue;
}
else if(!p[x-2]){
printf("2\n2 + %lld = %lld\n",x-2,x);
}
else{
pp=0;
if(x&1)x--,pp=1;
for(ll i=1;i<=w;++i){
if(!p[x-prime[i]]){
if(pp)printf("3\n1 + %lld + %lld = %lld\n",prime[i],x-prime[i],x+1);
else printf("2\n%lld + %lld = %lld\n",prime[i],x-prime[i],x);
break;
}
}
}
}
return 0;
}