题目链接:Link
Solution
由于素数都是正数,因此可以把素数预处理成一个队列,每次都尽量往上加。这样就可以用O(n)的时间算出方案数。
#include<cstdio>
inline bool isp(int a)
{
for(int i=2;i*i<=a;i++)
if(a%i==0) return false;
return true;
}
int p[10000],cnt,n,res,head,tail,sum;
int main()
{
for(int i=2;i<=10000;i++)
if(isp(i)) p[cnt++]=i;
#ifdef local
freopen("pro.in","r",stdin);
#endif
while(scanf("%d",&n)==1&&n)
{
res=(p[0]==n);//其实也不用特判 ╮(╯▽╰)╭
head=0;tail=1;
sum=p[0];
while(tail<cnt&&head<cnt)
{
sum+=p[tail++];//尽量往上加
while(sum>n) sum-=p[head++];//加过头了!
if(sum==n) res++;
}
printf("%d
",res);
}
return 0;
}