#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long int ll; typedef pair P; const int MAX=8001; const int INF=1e9; vector prime; bool isprime[MAX]; void sieve(){ for(int i=3; i>n; sieve(); int dp[20001][92]; int sum[92]; sum[0]=0; for(int i=1; i<92; i++){ sum[i]=sum[i-1]+prime[i-1]; } for(int i=2; i<=n; i++) fill(dp[i], dp[i]+92, INF); for(auto x:prime) dp[x][1]=x; for(int i=1; i<91; i++){ for(int j=sum[i]; j<=n; j++){ if(dp[j][i]==INF) continue; int k=upper_bound(prime.begin(), prime.end(), dp[j][i])-prime.begin(); if(k==prime.size()) continue; for(int l=k; (l=1; i--){ if(dp[n][i]