尺取-Sum of Consecutive Prime Numbers
问题:B
时间限制:1000毫秒
内存限制:65535 K.
描述
一些正整数可以由一个或多个连续素数的和表示。给定正整数有多少这样的表示?例如,整数53具有两个表示5 + 7 + 11 + 13 + 17和53.整数41具有三个表示2 + 3 + 5 + 7 + 11 + 13,11 + 13 + 17和41。 3只有一个表示,即3.整数20没有这样的表示。请注意,加数必须是连续的素数
数字,所以7 + 13和3 + 5 + 5 + 7都不是整数20的有效表示。
您的任务是编写一个程序,报告给定正整数的表示数。
输入
输入是一个正整数序列,每个都在一个单独的行中。整数介于2到10 000之间。输入的结尾用零表示。
产量
产量
输出应由每行对应于除最后一个零之外的输入行的行组成。输出行包括输入整数的表示的数量,作为一个或多个连续素数的总和。不应在输出中插入其他字符。
样本输入
2
3
17
41
20
666
12
53
0
样本输出
1
1
2
3
0
0
1
2
#include<bits/stdc++.h>
using namespace std;
long long su[10005],cnt;
int isprime[10005];
void prime()
{
cnt=1;
memset(isprime,1,sizeof(isprime));
isprime[0]=isprime[1]=0;
for (long long i=2;i<=10005;i++)
{
if (isprime[i])
su[cnt++]=i;
for (long long j=1;j<cnt&&su[j]*i<10005;j++)
{
isprime[su[j]*i]=0;
}
}
}
int main()
{
prime();
int n,sum,count1;
while(cin>>n&&n!=0)
{
count1=0;
int l=0,r=1;
sum=0;
for(;r<=10005;r++)
{
sum=sum+su[r];
if(sum<n)
continue;
while(sum>n&&l<r)
{
sum=sum-su[l++];
}
if (sum==n)
{
count1++;
}
}
cout<<count1<<endl;
}
return 0;
}