题解 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;
}
本作品由happyZYM采用知识共享 署名-非商业性使用-相同方式共享 4.0 (CC BY-NC-SA 4.0) 国际许可协议(镜像(简单版)镜像(完整版))进行许可。
转载请注明出处:https://www.cnblogs.com/happyZYM/p/11380103.html (近乎)全文转载而非引用的请在文首添加出处链接。