#define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; void findPrime(int N, vector& isPrime) { isPrime.assign(N+1, true); isPrime[0] = isPrime[1] = false; for(int i=2; i*i<=N; i++){ if(isPrime[i]){ for(int j=i; i*j<=N; j++){ isPrime[i*j] = false; } } } } const int INF = INT_MAX / 2; int main() { int n; cin >> n; vector isPrime; findPrime(n, isPrime); vector dp(n+1, -INF); dp[0] = 0; for(int a=1; a<=n; ++a){ if(!isPrime[a]) continue; for(int i=n-a; i>=0; --i) dp[i+a] = max(dp[i+a], dp[i] + 1); } if(dp[n] < 0) cout << -1 << endl; else cout << dp[n] << endl; return 0; }