#include using namespace std; using ll = long long; using V = vector; using VV = vector; using VVV = vector; using VVVV = vector; using VVVVV = vector; using VVVVVV = vector; using VS = vector; using VB = vector; using VVB = vector; using P = pair; using M = map; using Q = queue; using PQ = priority_queue; using PQG = priority_queue>; using S = set; using VP = vector

; const ll MOD = 1000000007; const ll mod = 998244353; const ll INF = 1LL << 60; #define rep(i,n) for(ll i = 0; i < n; i++) #define rep2(i,s,n) for(ll i = s; i < n; i++) #define per(i,n) for(ll i = n-1; i >= 0; i--) #define per2(i,s,n) for(ll i = n-1; i >= s; i--) #define all(x) (x).begin(),(x).end() #define rall(x) (x).rbegin(),(x).rend() #define fi first #define se second #define pb push_back #define pf push_front #define ppb pop_back #define ppf pop_front #define eb emplace_back #define lb lower_bound #define ub upper_bound templatebool chmin(T&a, const T&b){if(a>b){a=b;return true;}return false;} templatebool chmax(T&a, const T&b){if(avoid Vin(vector&a){rep(i,(ll)a.size())cin>>a[i];} templatevoid VVin(vector>&a){rep(i,(ll)a.size())Vin(a[i]);} templatevoid Vout(const vector&a){rep(i,(int)a.size()-1)cout<void Voutl(const vector&a){rep(i,(int)a.size())cout<0){if(b&1)res=res*a%M;a=a*a%M;b>>=1;}return res;} const ll H[4] = {0,1,0,-1}, W[4] = {1,0,-1,0}; struct Sieve { long long n; vector f, primes; Sieve(long long n): n(n), f(n+1) { f[0] = f[1] = -1; for(long long i = 2; i <= n; i++) { if(f[i]) continue; primes.push_back(i); f[i] = i; for(long long j = i*i; j <= n; j += i) if(!f[j]) f[j] = i; } } bool isPrime(long long x) { return f[x] == x; } vector factorList(long long x) { if(!x) return {}; vector res; while(x != 1) { res.push_back(f[x]); x /= f[x]; } return res; } vector> factor(long long x) { vector fl = factorList(x); if(fl.size() == 0) return {}; vector> res = {{fl[0],0}}; for(long long p : fl) { if(p == res.back().fi) res.back().se++; else res.emplace_back(p,1); } return res; } vector> bigfactor(long long x) { if(!x) return {}; vector> res; for(long long p : primes) { long long y = 0; while(x%p == 0) x /= p, y++; if(y) res.emplace_back(p,y); if(x == 1) break; } if(x != 1) res.emplace_back(x,1); return res; } }; int main() { cin.tie(nullptr); ios::sync_with_stdio(false); int n; cin >> n; int ans = 1; Sieve s(n + 1); ll sz = s.primes.size(); ll y = 1; S st; per(i, sz) { if(y * s.primes[i] > n) { cout << "? " << y << endl; ll z; cin >> z; VP p = s.bigfactor(z); for(auto q : p) { st.insert(q.fi); ans *= q.fi; } y = 1; } y *= s.primes[i]; if(i == 0) { cout << "? " << y << endl; ll z; cin >> z; VP p = s.bigfactor(z); for(auto q : p) { st.insert(q.fi); ans *= q.fi; } y = 1; } } for(ll x : st) { if(ans * x > n) break; ll z = 1; while(z <= n) z *= x; z /= x; cout << "? " << z << endl; ll t; cin >> t; ans *= t / x; } cout << "! " << ans << endl; }