#include using namespace std; typedef unsigned int uint; typedef long long int ll; typedef unsigned long long int ull; #define debugv(v) printf("L%d %s => ",__LINE__,#v);for(auto e:v){cout< ",__LINE__,#m);for(int x=0;x<(w);x++){cout<<(m)[x]<<" ";}cout<>=1,k++)s=(s<<1)|(u&1);for(;0>=1)cout<<(s&1);}} #define TIME chrono::system_clock::now() #define MILLISEC(t) (chrono::duration_cast(t).count()) template ostream& operator <<(ostream &o,const pair p){o<<"("< nonprime; vector primelist; void gen_primelist(vector& out, int high){ int i,j; out.resize(high+1); out[0] = out[1] = 1; int sqh = (int)sqrt(high); for (i=2; i<=sqh+1; i++){ if (out[i] == 0){ for (j=i*i; j<=high; j+=i){ // i*i out[j] = 1; } } } } int width,height; int m,n; int dp[40010]; int main(){ int i,j,k; int x,y,a,b; cin >> n; gen_primelist(nonprime,n); primelist.reserve(2000); for (i=2;i<=n;i++){ if (!nonprime[i]) primelist.push_back(i); } m = primelist.size(); dp[0]=1; int high=0; for (int slime:primelist){ for (i=min(high,n-slime);0<=i;i--){ if (dp[i]==0) continue; dp[i+slime] = max(dp[i]+1,dp[i+slime]); high = max(high,i+slime); } } cout << (dp[n]-1) << endl; return 0; }