#include #include #include #include #include // FOO_MAX, FOO_MIN #include #include // abs(int) #include #define roundup(n,d) ( ((n) + ((d)-1)) / (d) ) #define ll long long #define assign_max(into, compared) (into = max((into), (compared))) #define assign_min(into, compared) (into = min((into), (compared))) using namespace std; bool is_prime(int n){ if (n <= 1) return false; if (n == 2) return true; if (n % 2 == 0) return false; const int limit = min(((int)sqrt(n))+1,n); for(int i = 3;i <= limit;i+=2){ if (n % i == 0){ return false; } } return true; } //[2,limit] vector primenumbers(int limit){ vector primes; for(int i = 2;i <= limit;i++){ if(is_prime(i)){ primes.push_back(i); } } return primes; } int main(void){ int n; cin >> n; auto primes = primenumbers(n); const int primes_n = primes.size(); vector> dp (primes_n+1, vector (n+1)); for(int i = 0;i < primes_n;i++){ for(int j = 0;j <= n;j++){ dp[i+1][j] = dp[i][j]; if(j-primes[i] < 0){ continue; } if(dp[i][j-primes[i]] == 0 && j-primes[i] != 0){ continue; } dp[i+1][j] = max(dp[i][j], dp[i][j-primes[i]]+1); } } int ans = dp[primes_n][n] > 0 ? dp[primes_n][n] : -1; /* for(auto &v : dp){ for(auto &i : v){ cout << i << " "; } cout << endl; } */ cout << ans << endl; }