#include #include #include #include #include #include #include using namespace std; #define ll long long #define rep(i, n) for (ll i = 0; i < (n); i++) #define FOR(i,a,b) for(ll i=(a);i<(b);i++) #define FORR(i,a,b)for(ll i=(a);i<=(b);i++) #define repR(i,n) for(ll i=n;i>=0;i--) #define all(v)(v).begin(),(v).end() #define rall(v)(v).rbegin(),(v).rend() #define F first #define S second #define pb push_back #define pu push #define COUT(x) cout<<(x)< #define PQR priority_queue,greater> #define YES(n) cout << ((n) ? "YES" : "NO" ) << endl #define Yes(n) cout << ((n) ? "Yes" : "No" ) << endl #define mp make_pair #define maxs(x,y) (x = max(x,y)) #define mins(x,y) (x = min(x,y)) #define sz(x) (ll)(x).size() typedef pair pii; typedef pair pll; const ll MOD = 1000000007LL; const ll INF = 1LL << 60; using vll = vector; using vb = vector; using vvb = vector; using vvll = vector; using vstr = vector; using pll = pair; using vc = vector; using vvc = vector; template inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; } template inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; } ll dx[4]={0,1,0,-1}; ll dy[4]={1,0,-1,0}; ll n; vll arr(100005); vll s(0); void Eratosthenes(){ for(ll i = 2; i < n; i++){ arr[i] = 1; } for(ll i = 2; i < sqrt(n); i++){ if(arr[i]){ for(int j = 0; i * (j + 2) < n; j++){ arr[i *(j + 2)] = 0; } } } for(ll i = 2; i < n; i++){ if(arr[i]){ s.pb(i); } } } int main(){ cin>>n; Eratosthenes(); ll dp[sz(s)+10][n+1]; memset(dp,-1,sizeof(dp)); dp[0][0]=0; rep(i,sz(s))rep(j,n+1){ if(dp[i][j]>=0) dp[i+1][j]=max(dp[i+1][j],dp[i][j]); if(dp[i][j]>=0&&j+s[i]<=n) dp[i+1][j+s[i]]=max(dp[i+1][j+s[i]],dp[i][j]+1); } if(dp[sz(s)][n]==-1&&arr[n]){ COUT(1); } COUT(dp[sz(s)][n]); }