题目大意
有多组数据,每组一个n,以0结尾,若n=0,程序结束,求有多少种方法将n写成连续素数之和(n<=10000)。
分析
可预先将1到10000的素数和其前缀和处理出来,记为数组sum,在进行循环,判断是否有i,j,使得sum[i]-sum[j]=n,若有,则ans++。最后输出ans,时间为80ms。
#include<bits/stdc++.h>
using namespace std;
int prime[10001],sum[10001],v[10001],m=0,n;
void P(){
memset(prime,0,sizeof(prime));
memset(v,0,sizeof(v));
memset(sum,0,sizeof(sum));
for(int i=2;i<=10000;i++){
if(!v[i]){
v[i]=i;
prime[++m]=i;
sum[m]=sum[m-1]+i;
}
for(int j=1;j<=m;j++){
if(prime[j]>v[i]||prime[j]>10000/i)
break;
v[i*prime[j]]=prime[j];
}
}
}
int main(){
P();
while(scanf("%d",&n)){
int ans=0;
if(!n)
break;
for(int i=1;i<=m;i++){
for(int j=0;j<i;j++){
if(sum[i]-sum[j]==n){
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}