题解 UVA1210 【Sum of Consecutive Prime Numbers】

题目链接: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\n",res);
	}
	return 0;
}
posted @ 2019-08-19 22:15  happyZYM  阅读(84)  评论(0编辑  收藏  举报