找到上限,直接暴力枚举即可
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<list>
#include<ctime>
#define Memset(x) memset(x, 0, sizeof(x))
#define all(x) x.begin(), x.end()
const int E = 10000 + 10;
const double EPS = 1e-6;
using namespace std;
vector<int> prime;
int pri[E];
void dabiao(){
pri[0] = 1, pri[1] = 1, pri[2] = 0;
for(int i = 2; i < E; i++)
if(!pri[i]){
prime.push_back(i);
for(int j = i * 2; j < E; j += i)
pri[j] = 1;
}
}
int main(){
Memset(pri);
dabiao();
int n;
while(scanf("%d", &n) == 1 && n){
int sum = 0, len = upper_bound(all(prime), n) - prime.begin();
for(int i = len - 1; i >= 0; i--){
int temp = 0;
for(int j = i; j >= 0; j--){
if(temp + prime[j] > n) break;
temp += prime[j];
}
if(temp == n) sum++;
}
printf("%d\n", sum);
}
return 0;
}