#include #include #include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; // エラトステネスのふるいでN以下の素数を求める vector isPrime(N + 1, true); if (N >= 0) isPrime[0] = false; if (N >= 1) isPrime[1] = false; for (int i = 2; i * i <= N; ++i) { if (!isPrime[i]) { continue; } for (int j = i * i; j <= N; j += i) { isPrime[j] = false; } } vector primes; for (int i = 2; i <= N; ++i) { if (isPrime[i]) { primes.push_back(i); } } // dp[s] = sを作るのに使用できる素数の最大個数 // -1は作れないことを表す vector dp(N + 1, -1); dp[0] = 0; for (int prime : primes) { // 降順に更新することで、同じ素数を複数回使うことを防ぐ for (int sum = N; sum >= prime; --sum) { if (dp[sum - prime] == -1) { continue; } dp[sum] = max(dp[sum], dp[sum - prime] + 1); } } cout << dp[N] << '\n'; return 0; }