#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define REP(i,a,b) for(int i=a;i<(int)b;i++) #define rep(i,n) REP(i,0,n) #define all(c) (c).begin(), (c).end() #define zero(a) memset(a, 0, sizeof a) #define minus(a) memset(a, -1, sizeof a) #define minimize(a, x) a = std::min(a, x) #define maximize(a, x) a = std::max(a, x) typedef long long ll; int const inf = 1<<29; typedef __int128_t INT; INT N; bool miller_rabin_primality_test(INT p,INT iteration){ auto modulo=[](INT a,INT b,INT c){ INT res = 1; for(INT i=0;i 0){ if(b%2 == 1){ x = (x+y)%c; } y = (y*2)%c; b /= 2; } return x%c; }; if(p<2){ return false; } if(p!=2 && p%2==0){ return false; } INT s=p-1; while(s%2==0){ s/=2; } for(INT i=0;i mp = { {4,3}, {6,5}, {8,7}, {9,7}, {10,7}, {12,11}, {14,13}, {15,7}, {16,7}, {18,8}, {20,19}, {21,19}, {22,7}, {24,23}, }; INT dx[4] = {-1,0,1,0}; INT dy[4] = {0,-1,0,1}; bool bfs(INT W, INT s) { queue q; set vis; q.push(s); vis.clear(); vis.insert(s); while(!q.empty()) { INT p = q.front(); q.pop(); if(s == 0 && p == N-1) { return true; } if(s == N-1 && p == 0) { return true; } INT x = p % W, y = p / W; rep(i, 4) { INT nx = x + dx[i], ny = y + dy[i]; if(nx<0 || W<=nx || ny<0) { continue; } if(ny*W+nx>=N) { continue; } if(miller_rabin_primality_test(ny*W+nx + 1, 10)) { continue; } if(vis.count(ny*W+nx)) { continue; } vis.insert(ny*W+nx); q.push(ny*W+nx); } } return vis.count(s == 0 ? N-1 : 0); } int main() { string s; cin >> s; INT N = 0; rep(i, s.size()) { N *= 10; N += s[i] - '0'; } if(mp.find(N) != mp.end()) { cout << mp[N] << endl; exit(0); } /* if((N-1) % 8 == 1 && miller_rabin_primality_test(N-8, 100)) { cout << 14 << endl; } else { cout << 8 << endl; } */ if(N % 8 == 1 && miller_rabin_primality_test(N-8, 1)) { cout << 14 << endl; } else { cout << 8 << endl; } return 0; }