#51612: 修練愛情的悲歡 我們這些奴隸不煎蛋


1121226@stu.wghs.tp.edu.tw (Arthur✨EC)

學校 : 臺北市私立薇閣高級中學
編號 : 252772
來源 : [60.248.154.139]
最後登入時間 :
2025-08-21 12:59:45

#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;
}