10168 Summation of Four Primes

来源:互联网 发布:淘宝店铺招牌模板下载 编辑:程序博客网 时间:2024/05/30 22:54

一道数论的题,问一个数是否能被分解成四个素数相加的方式,打表发现知道1e7之内的相邻素数之间的差距不超过145,而素数只有一个2是偶数。

而根据哥伦巴克猜想每个非二偶数都可以拆成两个素数的和。这样我们直接对200以下的偶数打表处理出两个素数之和。

这样分情况讨论,200以下的书直接用2和3构造出一个偶数。而对于大于200的数直接求出比他小30以上的素数作为b,再更具奇偶用2或者3构造出一个小于200 的偶数,再利用打表来得出剩下两个数。废话不多说,代码~~~~~

#include <iostream>#include <cstring>#include <cstdlib>#include <cmath>#include <vector>#include <functional>#include <cstdio>#include <queue>#include <map>#include <algorithm>#include <stack>#include <utility>typedef  long long ll;using namespace std;const int mx = 10000009;int p[mx],num[mx],pri[200];bool tag[mx];int cnt,N;void get_prime(){    int i,j;    cnt = 0;    N = mx;    for(i = 2; i < mx; i++)    {        if(!tag[i])        {            p[cnt++] = i;        }        num[i] = p[cnt - 1];        for(j = 0; p[j] * i < N && j < cnt; j++)        {            tag[i * p[j]] = 1;            if(i % p[j] == 0)                break;        }    }}void get(){    int i,j,k;    for(i = 4; i < 200; i += 2)    {        for(j = 2; j < i; j++)            if(!tag[j]&&!tag[i - j])            {                pri[i] = j;//                printf("i = %d j =%d\n",i,j);                break;            }    }}int main (){    int n;    int a,b,c,d;    get_prime();    get();    while(~scanf("%d",&n))    {        if(n < 8)        {            printf("Impossible.\n");            continue;        }        if(n < 200)        {            if(n&1)            {                a = 2;                b = 3;            }            else            {                a = 2;                b = 2;            }        }        else        {            if(n&1)            {                a = 2;                b = num[n - 30];            }            else            {                a = 3;                b = num[n - 30];            }        }        n = n - a - b;        c = pri[n];        d = n - c;        printf("%d %d %d %d\n",a,b,c,d);    }}

0 0
原创粉丝点击