#include #include using namespace std; #define chmax(a, b) a = (((a)<(b)) ? (b) : (a)) #define pb push_back bool isprime[20010]; //エラトステネス void eratos(int m){ for (int i = 0; i <= m; ++i) isprime[i] = true; isprime[0] = isprime[1] = false; //iを残してiの倍数を消していく for (int i = 2; i <= m; ++i){ if(isprime[i]){ for (int j = 2 * i; j <= m; j += i){ isprime[j] = false; } } } } vector prime; //dp[i] := 合計がjとなるときの最大値 int dp[20010]; int main(void){ int n; cin >> n; for(int i = 0; i < n+1;i++) dp[i] = -1; eratos(20010); for(int i=(2);i<(20001);i++){ if(isprime[i]){ prime.pb(i); } } dp[0] = 0; for(auto u : prime){ for (int j = n; j >= 0; --j){ if(u + j <= n && dp[j] != -1){ chmax(dp[u + j], dp[j] + 1); } } } printf("%d\n", dp[n]); return 0; }