#include using namespace std; //高速化 struct ponjuice{ponjuice(){cin.tie(0);ios::sync_with_stdio(0);cout<using vc = vector; templateusing vvc = vc>; templateusing vvvc = vvc>; using vi = vc; using vvi = vvc; using vvvi = vvvc; using vl = vc; using vvl = vvc; using vvvl = vvvc; using pi = pair; using pl = pair; using ull = unsigned ll; templateusing priq = priority_queue; templateusing priqg = priority_queue, greater>; // for文 #define overload4(a, b, c, d, e, ...) e #define rep1(n) for(ll i = 0; i < n; i++) #define rep2(i, n) for(ll i = 0; i < n; i++) #define rep3(i, a, b) for(ll i = a; i < b; i++) #define rep4(i, a, b, step) for(ll i = a; i < b; i+= step) #define rep(...) overload4(__VA_ARGS__, rep4, rep3, rep2, rep1)(__VA_ARGS__) #define per1(n) for(ll i = n-1; i >= 0; i--) #define per2(i, n) for(ll i = n-1; i >= 0; i--) #define per3(i, a, b) for(ll i = b-1; i >= a; i--) #define per4(i, a, b, step) for(ll i = b-1; i >= a; i-= step) #define per(...) overload4(__VA_ARGS__, per4, per3, per2, per1)(__VA_ARGS__) //関数 #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() #define si(x) (ll)(x).size() templateinline bool chmax(S& a, T b){return a < b && ( a = b , true);} templateinline bool chmin(S& a, T b){return a > b && ( a = b , true);} inline void yes(){cout << "Yes\n";} inline void no(){cout << "No\n";} inline void yesno(bool y = true){if(y)yes();else no();} //定数 constexpr ll mod = 998244353; constexpr ll minf=-(1<<29); constexpr ll inf=(1<<29); constexpr ll MINF=-(1LL<<60); constexpr ll INF=(1LL<<60); const int dx[4] ={-1, 0, 1, 0}; const int dy[4] ={ 0, 1, 0,-1}; const int dx8[8] ={-1,-1,-1, 0, 1, 1, 1, 0}; const int dy8[8] ={-1, 0, 1, 1, 1, 0,-1,-1}; void solve(); int main() { int t = 1; // cin >>t; while(t--)solve(); } /* せっかくなので、PPC は全てコメント書きます インタラクティブ多めでいいね! 確実にゼロでは無い位があるので、それを用いて聞いていく 0でない返答が2個以上ある場合、 ab, ac, bc の情報から一位に答えが定まる 具体的には sqrt(ab*bc*ca)/ab = c なので、後はノリで 0 である返答が1つしかない場合 81,64,47,36,25,1 の場合のみ一意に定まりそう 0この場合 不可能 */ ll sqrt_ll(ll x) { ll res = sqrtl(x); while(res * res < x) res++; while(res * res > x) res--; return res; } void solve(){ int n; cin >> n; vector res(n-1, 0); int cnt = 0; rep(i,0,n-1) { cout << "? " << i << " " << n-1 << endl; cin >> res[i]; if(res[i]) cnt++; } if(cnt == 0) { cout << "! -1" << endl; return; } if(cnt == 1) { set ok = {81,64,47,36,25,1}; rep(i,0,n-1) { if(ok.count(res[i])) { ll sq = sqrt_ll(res[i]); cout << "! "; rep(j,0,n) { if(j == 0 || j == n-1-i) cout << sq; else cout << 0; } cout << endl; return; } } cout << "! -1" << endl; return; } int x = -1,y = 0; rep(i,0,n-1) { if(res[i]) { if(x == -1) x = i; else y = i; } } cout << "? " << x << " " << y << endl; int rs; cin >> rs; ll sq = rs * res[x] * res[y]; sq = sqrt_ll(sq); ll a = sq / rs; cout << "! "; cout << a; rep(i,0,n-1) cout << res[n-2-i]/a; cout << endl; }