#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 calc(int num,int pi=0){ static unordered_map memo; //printf("%d %d\n",num,pi); if (num == 0) return 1; ll key = ((ll)num<<32)|((ll)pi); if (memo.count(key)) return memo[key]; int res = 0,t; for (int i=pi;inum) break; t = calc(num-primelist[i],i+1); if (t) res = max(res,t+1); } return memo[key] = res; } 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); } cout << (calc(n)-1) << endl; return 0; }