题解 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 @   happyZYM  阅读(85)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示