紫书p343
素数打表,再求前缀和,最后通过两重循环,通过前缀和快速求出区间值,找到满足的数就答案+1
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <cmath>
#include <set>
#include <queue>
using namespace std;
const int INF=1e9+10;
typedef long long ll;
bool isprime[10005];//用true表示i是素数
int prime[10005];//第i个素数
int get_prime(int n){
int p=0;
for(int i=0;i<=n;i++) isprime[i]=true;
isprime[0]=isprime[1]=false;
for(int i=2;i<=n;i++){
if(isprime[i]){
prime[p++]=i;
for(int j=2*i;j<=n;j+=i) isprime[j]=false;
}
}
return p;
}
ll sum[10005],n;
int main(){
int p=get_prime(10005);
for(int i=1;i<=p;i++){
sum[i]=sum[i-1]+prime[i-1];
}
while(scanf("%d",&n)&&n){
ll ans=0;
for(int i=1;prime[i-1]<=n;i++){
for(int j=0;j<i;j++)
if(sum[i]-sum[j]==n) ans++;
}
printf("%lld\n",ans);
}
return 0;
}