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;
}