#include using namespace std; #define rep(i, a, b) for (int i = (int)(a); i < (int)(b); i++) #define rrep(i, a, b) for (int i = (int)(a); i > (int)(b); i--) #define ll long long #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define PQ priority_queue, greater> #define PQ_g priority_queue, vector>, greater>> #define chmin(a, b) a = min(a, b) #define chmax(a, b) a = max(a, b) const int d4[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; const int d8[8][2] = {{0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}, {-1, 0}, {-1, 1}}; void Yes(bool b) {cout << (b ? "Yes" : "No") << endl;} int determine_2_dig(int prod) { vector cand; rep(i, 10, 100) { if ((i % 10) * (i / 10) == prod) cand.push_back(i); } if (cand.size() >= 2) { return -1; } else { return cand[0]; } } int int_sqrt(int n) { int l = 0, r = 1000; while (r - l > 1) { int m = (l + r) >> 1; if (n < m * m) r = m; else l = m; } return l; } int main() { int n; cin >> n; vector ans(n); rep(i, 0, n - 1) { cout << "? " << i << ' ' << (n - 1) << endl; cin >> ans[i]; } if (n == 2) { int ans_num = determine_2_dig(ans[0]); cout << "! " << ans_num << endl; } else { vector not_0_ind; rep(i, 0, n - 1) { if (ans[i] != 0) not_0_ind.push_back(i); if (not_0_ind.size() == 2) break; } bool determined = false; if (not_0_ind.size() == 0) { cout << "! -1" << endl; } else if (not_0_ind.size() == 1) { int ind = not_0_ind[0]; int ans_num = determine_2_dig(ans[ind]); if (ans_num == -1) cout << "! -1" << endl; else { determined = true; ans[n - 1] = ans_num / 10; ans[ind] = ans_num % 10; } } else { determined = true; int ind1 = not_0_ind[0]; int ind2 = not_0_ind[1]; cout << "? " << ind1 << ' ' << ind2 << endl; int p; cin >> p; int leader_ans = int_sqrt(ans[ind1] * ans[ind2] / p); ans[n - 1] = leader_ans; rep(i, 0, n - 1) ans[i] /= leader_ans; } if (determined) { cout << "! "; rrep(i, n - 1, -1) cout << ans[i]; cout << endl; } } }