virtual hust 2013.6.21 NEFU 挑战编程----数论 E - Summation of Four Primes

题目:Summation of Four Primes

思路:好像有个什么定理说是任意的一个偶数都可以表示成两个素数的和,所以对于输入的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.\n");
            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\n",prime[i],n-prime[i]);
                break;
            }
        }
    }
    return 0;
}
View Code
posted @ 2013-06-21 14:21  over_flow  阅读(218)  评论(0编辑  收藏  举报