题意:一些整数可以用一个或多个连续的素数和表示。现在他给出你一个正整数n,你要算出这个整数可以有多少种这样的表示方法。
比如:53 有两种表示方法 5 + 7 + 11 + 13 + 17 和 53
思路:先筛出素数表,直接枚举左右端点会超时,所以尺取。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int maxn=10005;
const double eps=1e-8;
const double PI = acos(-1.0);
int vis[maxn],prime[maxn],tot;
void shai()
{
tot=0;
memset(vis,0,sizeof(vis));
for(int i=2;i<=maxn;i++)
{
//如果未标记则得到一个素数
if(!vis[i])
{
prime[tot++]=i;
}
//标记目前得到的素数的i倍为非素数
for(int j=0;j<tot&&prime[j]*i<maxn;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0) //精髓 prime数组 中的素数是递增的,当 i 能整除 prime[j],那么 i*prime[j+1] 这个合数肯定被 prime[j] 乘以某个数筛掉
{
break;
}
}
}
}
int main()
{
int n;
shai();
while(scanf("%d",&n)&&n)
{
int l=0,r=0,ans=0,sum=0;
while(1)
{
while(r<tot&&prime[r]<=n&&sum<n)
{
sum+=prime[r++];
}
if(sum<n)
break;
if(sum==n)
ans++;
sum-=prime[l++];
}
cout<<ans<<endl;
}
return 0;
}