lightoj1259 【素数预处理】

题意:
输出有多少对满足条件的(a,b)
both a and b are prime;
a+b=n
a<=b;
思路:
一开始想的就是打表一个素数数组,然后还去二分。。mdzz。。直接判断一下n-A[I]是不是素数和是不是>=A[I]就好了。
都能标记何必二分…= =、我比较蠢。。
然后是内存爆了。。
后来标记的需要开bool,而且那个记录素数的数组最好开小;
以后int a[1e7]要么就不开,要么就开bool类型。。。谨慎。。
PS:亲测,int a[1e7]爆内存,32778kb= =

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e7+10;
bool isPrime[N];
int sum[N/10];
int num;

void init()
{
    memset(isPrime,0,sizeof(isPrime));
    for(int i=2;i<=10000000;i++)
    {
        if(isPrime[i]) continue;
        for(int j=i+i;j<=10000000;j+=i)
        {
            isPrime[j]=1;
        }
    }
    num=0;
    for(int i=2;i<=10000000;i++)
    {
        if(!isPrime[i])
            sum[++num]=i;
    }
}

int main()
{
    int n;
    init();
    int T,cas=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        int ans=0;
        for(int i=1;i<=num;i++)
        {
            if(!isPrime[n-sum[i]]&&(n-sum[i])>=sum[i])
            {
                ans++;
            }
            if(sum[i]>=n/2)
                break;
        }
        printf("Case %d: %d\n",cas++,ans);
    }
    return 0;
}
posted @ 2016-09-13 21:03  see_you_later  阅读(122)  评论(0编辑  收藏  举报