#define _USE_MATH_DEFINES #include using namespace std; using ul = unsigned long long; using ll = long long; using ld = long double; using pll = pair; #define in(v,c) ((c).find(v) != (c).end()) #define F(i,n) for(ll i = 0; i < (ll)(n); i++) #define Fun(i,n) for(ul i = ; i < (n); i++) #ifdef GPD templatevoid lerr(F&&f){cerr<(f)<void lerr(F&&f,R&&...r){cerr<(f)<<' ';lerr(forward(r)...);} #else #define lerr(...) #endif vector primesgen(ll lim = 1e6) { vector isPrime(lim, true); isPrime[0] = isPrime[1] = false; for(ll i = 4; i < (ll)isPrime.size(); i+=2) isPrime[i] = false; for(ll i = 3; i*i < (ll)isPrime.size(); i+=2) { if(!isPrime[i]) continue; for(ll j = i+i; j < (ll)isPrime.size(); j += i) isPrime[j] = false; } vector ret; F(i, isPrime.size()) { if(isPrime[i]) ret.push_back(i); } return ret; } ll p; vector primes; vector> dp; const ll undef = -1; ll solve(ll prev, ll cur) { if(cur == (ll)primes.size() -1) return (primes[cur] - primes[prev]) <= 14; if(primes[cur] - primes[prev] > 14) return 0; if(dp[prev][cur] != undef) return dp[prev][cur]; ll ret = solve(prev, cur + 1) + solve(cur, cur + 1); return dp[prev][cur] = ret; } int main(int argc, char const *argv[]) { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); cout << setprecision(9) << fixed; lerr("ready"); cin >> p; primes = primesgen(p); if(primes.back() != p) primes.push_back(p); dp = vector>(primes.size()+7, vector(primes.size()+7, undef)); cout << solve(0, 1) << endl; return 0; }