#include #include #include using namespace std; vector sieve(int n) { vector primes; vector is_composite(n + 1, false); for (int num = 2; num <= n; num++) { if (!is_composite[num]) { primes.push_back(num); for (int i = 2; i * num <= n; i++) is_composite[i * num] = true; } } return move(primes); } // dp[i] = iを素数の和で表現するとき, 素数の数の最大値 int main() { int N; cin >> N; vector dp(N + 1, -1); vector primes = sieve(N); for (int prime : primes) { for (int num = 0; num <= N; num++) { int updated = num + prime; if (updated < N + 1) { dp[updated] = max(dp[updated], dp[num] + 1); } } } return dp[N]; }