思路:好像有个什么定理说是任意的一个偶数都可以表示成两个素数的和,所以对于输入的n,最糟糕的情况是n=8=2+2+2+2,小于8的无解,对于大于8的情况,如果是奇数,我们就拿一个2和一个3出来,如果是偶数,我们就拿两个2出来,那么剩下的就是求某个偶数等于两个素数之和,继续暴力
#include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <iostream> using namespace std; #define maxn 10000001 bool vis[maxn]; int n_prime=0; int prime[maxn/6]; void Prime() { memset(vis,true,sizeof(vis)); for(int i=2;i<maxn;i++) if(vis[i]) { prime[++n_prime]=i; for(int j=2*i;j<maxn;j+=i) vis[j]=0; } } int main() { int n; Prime(); while(scanf("%d",&n)!=EOF) { if(n<8) { printf("Impossible. "); continue; } else if(n&1) { printf("2 3 "); n-=5; } else { printf("2 2 "); n-=4; } for(int i=1;i<=n_prime;i++) { if(vis[n-prime[i]]) { printf("%d %d ",prime[i],n-prime[i]); break; } } } return 0; }