题目链接
题意:给定一个数,要你写成数量小于3的素数和(哥德巴赫猜想)
思路:先打表1e6的素数表,然后就暴力(居然没超时也是幸运)。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+1;
int top=0,prime[maxn],isprime[maxn<<2];
ll num[maxn];
void Prime(int n)
{
for(int i=2;i<n;++i)
{
if(!isprime[i]) prime[top++]=i;
for(int j=0;j<top;++j)
{
if(i*prime[j]>n) break;
isprime[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
bool is(int x)
{
if(x<2) return false;
for(int i=2;i*i<=x;++i)
if(x%i==0) return false;
return true;
}
int main()
{
int n;
scanf("%d",&n);
if(n==3){
puts("1");
puts("3");return 0;
}
if(n==5){
puts("1");
puts("5");return 0;
}
if(n==7){
puts("1");
puts("7");return 0;
}
Prime(maxn);
for(int i=0;i<top;++i)
{
if((n-3-prime[i]>maxn&&is(n-3-prime[i]))){
puts("3");
printf("%d %d %d\n",3,prime[i],n-3-prime[i]);
return 0;
}
else if(n-3-prime[i]<maxn){
if(!isprime[n-3-prime[i]])
{
puts("3");
printf("%d %d %d\n",3,prime[i],n-3-prime[i]);
return 0;
}
}
}
}