#include #include using namespace std; using i64 = long long; int n; constexpr int inf = 987654321; vector primes; vector> dp; int m; // i番目を見てる。今までの和は acc int rec(int i, int acc) { int &res = dp[i][acc]; if(res != -1) { return res; } if(i == m) { if(acc == n) { return res = 0; } return res = -inf; } res = rec(i+1, acc); if(acc + primes[i] <= n) { res = max(res, rec(i+1, acc+primes[i]) + 1); } return res; } int main(void) { scanf("%d", &n); vector is_prime(n+1, true); is_prime[0] = is_prime[1] = false; int sq = sqrt(n); for(int i=2; i<=sq; ++i) { if(is_prime[i]) { for(int j=i*i; j<=n; j+=i) { is_prime[j] = false; } } } for(int i=2; i<=n; ++i) { if(is_prime[i]) { primes.push_back(i); } } m = primes.size(); dp.assign(m+1, vector(n+1, -1)); int res = rec(0, 0); if(res < 0) { res = -1; } printf("%d\n", res); return 0; }