#include using namespace std; long long ask(int a, int b) { cout << "? " << a << " " << b << '\n'; cout.flush(); long long x; cin >> x; if (x == -1) exit(0); return x; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; vector> p(N, vector(N, -1)); // Query chain (N-1 queries) for (int i = 1; i < N; i++) { p[0][i] = p[i][0] = ask(0, i); } // Extra queries to resolve ambiguity if (N >= 3) { p[1][2] = p[2][1] = ask(1, 2); } vector> solutions; for (int d0 = 0; d0 <= 9; d0++) { for (int d1 = 0; d1 <= 9; d1++) { if (d0 * d1 != p[0][1]) continue; vector d(N, -1); d[0] = d0; d[1] = d1; bool ok = true; for (int i = 2; i < N; i++) { if (d0 != 0) { if (p[0][i] % d0 != 0) { ok = false; break; } d[i] = p[0][i] / d0; } else if (d1 != 0) { if (p[1][i] == -1) { p[1][i] = p[i][1] = ask(1, i); } if (p[1][i] % d1 != 0) { ok = false; break; } d[i] = p[1][i] / d1; } else { // both zero → completely ambiguous ok = false; break; } if (d[i] < 0 || d[i] > 9) { ok = false; break; } } // Validate all known constraints for (int i = 0; i < N && ok; i++) { for (int j = i+1; j < N && ok; j++) { if (p[i][j] != -1) { if (d[i] * d[j] != p[i][j]) { ok = false; } } } } if (ok) solutions.push_back(d); } } if (solutions.size() != 1) { cout << "! -1\n"; cout.flush(); return 0; } // Build answer long long X = 0, pw = 1; for (int i = 0; i < N; i++) { X += solutions[0][i] * pw; pw *= 10; } cout << "! " << X << '\n'; cout.flush(); }