HDU 2098 分拆素数和(素数)
http://acm.hdu.edu.cn/showproblem.php?pid=2098
题意:
给你一个偶数,问你这个偶数有多少种方式能由两个不同的素数构成?
分析:
首先求出10000以内的所有素数。
如果这个偶数X能有两个不同的素数构成,那么一定一个小于(X/2-1). 只要从小到大枚举这个比较小的素数a,然后看看X-b是否是素数即可得到一种组合方式。
依次统计所有组合方式即可。
AC代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=10000;
//flag[i]==1表i是素数
bool flag[maxn+5];
int prime[maxn+5];
//筛选法求maxn内所有素数
int get_prime()
{
for(int i=2;i<=maxn;i++)
{
if(!prime[i])
{
prime[++prime[0]]=i;
flag[i]=true;
}
for(int j=1;j<=prime[0] && prime[j]<=maxn/i; j++)
{
prime[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
return prime[0];
}
int main()
{
get_prime();
int x;
while(scanf("%d",&x)==1 && x)
{
int ans=0;//方法数
for(int i=1;i<=prime[0] && prime[i]<= x/2-1;i++)
{
if(flag[x-prime[i]]) ans++;
}
printf("%d\n",ans);
}
return 0;
}