#include <bits/stdc++.h> using namespace std; vector<int> sieve_primes(int maxn){ vector<bool> is_prime(maxn+1,true); is_prime[0]=is_prime[1]=false; for (int i=2;i*i<=maxn;i++){ if (is_prime[i]){ for (int j=i*i;j<=maxn;j+=i){ is_prime[j]=false; } } } vector<int> primes; for (int i=2;i<=maxn;i++){ if (is_prime[i]) primes.push_back(i); } return primes; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); const int MAXN=10000; vector<int> primes=sieve_primes(MAXN); int n; while (cin>>n&&n!=0){ int cnt=0; int l=0,r=0; int sum=0; // 雙指標在 primes 上找連續區間和 = n while (true){ if (sum<n){ if (r==(int)primes.size()||primes[r]>n) break; // 後面再加一定會超或無法再等於 sum+=primes[r++]; } else if (sum>n){ sum-=primes[l++]; } else{ // sum == n cnt++; if (r==(int)primes.size()||primes[r]>n) break; sum+=primes[r++]; } // 避免左指標超過右指標造成狀態錯亂 if (l>r){ r=l; sum=0; } // 當左端的質數已經大於 n,任何連續和都不可能再等於 n if (l<(int)primes.size()&&primes[l]>n) break; } // 還要處理單點區間(n 本身是質數)的情況:其實雙指標已涵蓋,但保險可不需特判 cout<<cnt<<endl; } return 0; }