线性筛 - Goldbach`s Conjecture - LightOJ 1259

线性筛 - Goldbach`s Conjecture - LightOJ 1259

题意:

n = a + b   a , b a b a + b = n n=a+b\\ \ \\ 满足a,b都是质数且a≤b,a+b=n方案个数。

Input

T T ( 300 ) n ( 4 n 1 0 7 ) n 输入一个T,代表样例数量 T(≤ 300)。 每一行输入一个n (4 ≤ n ≤ 10^7)。 n是个偶数。

Output

n 每一行输出样例的行号以及可以表示n的两个素数之和的方式数。

Sample Input

2
6
4

Sample Output

Case 1: 1
Case 2: 1

T i m e   l i m i t 2000 m s M e m o r y   l i m i t 32768 k B Time\ limit:2000 ms,Memory \ limit:32768 kB


分析:

线 1 0 7 n a b = n a 线性筛出10^7以内的质数,对于每一个n,枚举一个质数a,再判断b=n-a是不是质数,统计总方案数即可。

注意:

a b n 2 a 由于a≤b,故我们只需枚举到\frac{n}{2}以内的质数a。

1 0 7 6 × 1 0 5 7 × 1 0 5 由于空间限制,10^7以内的质数在6×10^5数量级,我们开7×10^5足够,防止超内存。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>

#define ll long long

using namespace std;

const int N=1e7+10;

int n;
int primes[700000],cnt;
bool st[N];

void get_prime(int n)
{
    for(int i=2;i<=n;i++)
    {
        if(!st[i]) primes[cnt++]=i;
        for(int j=0;primes[j]*i<=n;j++)
        {
            st[primes[j]*i]=true;
            if(i%primes[j]==0) break;
        }
    }
}

int main()     
{
    get_prime(N-1);

    int T; cin>>T;
    for(int t=1;t<=T;t++)
    {
        cin>>n;
        int res=0;
        for(int i=0;primes[i]<=n/2;i++)
        {
            int a=primes[i];
            int b=n-a;
            if(!st[b]) res++;
        }
        printf("Case %d: %d\n",t,res);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/njuptACMcxk/article/details/107738793
今日推荐