#include using namespace std; int solve(const string& s, int a, int b, int N) { return (s[N - 1 - a] - '0') * (s[N - 1 - b] - '0'); } int main() { int N; if (!(cin >> N)) return 0; vector p(N - 1); for (int i = 0; i < N - 1; ++i) { cout << "? " << i << " " << N - 1 << endl; cin >> p[i]; if (p[i] == -1) return 0; } vector ans; for (int k = 1; k <= 9; ++k) { string s = ""; bool ok = true; for (int i = 0; i < N - 1; ++i) { if (p[i] % k == 0 && p[i] / k <= 9) { s += to_string(p[i] / k); } else { ok = false; break; } } if (ok) { s += to_string(k); reverse(s.begin(), s.end()); ans.push_back(s); } } if (ans.size() > 1) { int best_a = -1, best_b = -1; int max = 0; for (int a = 0; a < N; ++a) { for (int b = a + 1; b < N; ++b) { set X; for (const string& s : ans) { X.insert(solve(s, a, b, N)); } if ((int)X.size() > max) { max = X.size(); best_a = a; best_b = b; } } } if (best_a != -1 && max > 1) { cout << "? " << best_a << " " << best_b << endl; int p_last; cin >> p_last; if (p_last == -1) return 0; vector next_ans; for (const string& s : ans) { if (solve(s, best_a, best_b, N) == p_last) { next_ans.push_back(s); } } ans = next_ans; } } if (ans.size() == 1) { cout << "! " << ans[0] << endl; } else { cout << "! -1" << endl; } return 0; }