sicily 1259 Sum of Consecutive Primes

#include<iostream>        
#include<stdio.h>
#include<string.h>
using namespace std;
#define maxn 10002
bool isPrime[maxn];
int prime[maxn],cnt;

void make_prime() //线性筛法求素数
{
cnt=0;
memset(isPrime,true,sizeof(isPrime));
for(int i=2;i<=maxn;++i)
{
if(isPrime[i])
prime[cnt++]=i;
for(int j=0;j<cnt&&prime[j]*i<=maxn;++j)
{
isPrime[prime[j]*i]=false;
if(i%prime[j]==0)
break;
}
}
}

int query(int num)
{
int res=0;
int sum=0,j=0;
for(int i=0;i<cnt&&prime[i]<=num;++i)
{
for(;sum<num&&j<cnt;++j) //注意到假若P[i]+P[i+1]+...+P[j]=num,则若要P[i+1]+...+P[k]=num,则k>=j+1,即j同i一样,也是递增的
sum+=prime[j];
if(sum==num)
res++;
sum-=prime[i];
}
return res;
}
int main()
{
make_prime();
int a;
while(scanf("%d",&a)&&a)
printf("%d\n",query(a));
return 0;
}

posted on 2011-07-05 02:56  sysu_mjc  阅读(260)  评论(0编辑  收藏  举报

导航