#include using namespace std; using ll = long long; using P = pair; using T = tuple; #define al(a) a.begin(), a.end() #define ral(a) a.rbegin(), a.rend() #define sz(a) (int)a.size() #define rep(i, n) for (int i = 0; i < (n); ++i) #define rrep(i, n) for (int i = 1; i <= (n); ++i) #define drep(i, n) for (int i = (n)-1; i >= 0; --i) #define db(a, b) cout << #a << ": " << a << " " << #b << ": " << b << endl; int main() { int n; cin >> n; vector f(n + 1), a; f[0] = f[1] = -1; for (int i = 2; i <= n; ++i) { if (f[i]) continue; a.push_back(i); for (int j = i + i; j <= n; j += i) { f[j] = i; } } vector dp(n + 1, -1); dp[0] = 0; int m = sz(a); rep(i, m) { // db(i, a[i]); drep(j, n) { if (dp[j] == -1) continue; if (j + a[i] > n) continue; dp[j + a[i]] = max(dp[j + a[i]], dp[j] + 1); } } cout << dp[n] << endl; return 0; }