素数筛 LightOJ

来源:互联网 发布:淘宝网灯具城 编辑:程序博客网 时间:2024/06/06 14:17
Goldbach's conjecture is one of the oldest unsolved problems in number theory and in all of mathematics. It states:Every even integer, greater than 2, can be expressed as the sum of two primes [1].Now your task is to check whether this conjecture holds for integers up to 107.

Input

Input starts with an integer T (≤ 300), denoting the number of test cases.Each case starts with a line containing an integer n (4 ≤ n ≤ 107, n is even).

Output

For each case, print the case number and the number of ways you can express n as sum of two primes. To be more specific, we want to find the number of (a, b) where1)      Both a and b are prime2)      a + b = n3)      a ≤ b

Sample Input

264

Sample Output

Case 1: 1Case 2: 1

题意就是找一个偶数可以分解为几对素数之和,数据有些大,需要用筛法求素数。

#include <iostream>#include <cmath>#include <cstring>#include <algorithm>#include <stdio.h>using namespace std;typedef long long ll;const int INF=0x3f3f3f3f;const int maxn=1e7;bool vis[maxn];int pri[maxn/10];void prime(){    memset(vis,0,sizeof(vis));    int num=0;    for(int i=2;i<maxn;i++)    {        if(!vis[i])       //原理就是每次标记所有约数有i的数,然后遍历所有没有被标记过的数        {            pri[++num]=i;            for(int j=i*2;j<=maxn;j+=i)            vis[j]=1;        }    }}int main(){    prime();    int t,n;    cin>>t;    for(int cas=1;cas<=t;cas++)    {        cin>>n;        int ans=0,tmp=n/2;        for(int i=1;pri[i]<=tmp;i++)        {            if(vis[n-pri[i]]==0)            {                ans++;            }        }        cout<<"Case "<<cas<<": "<<ans<<endl;    }    return 0;}