#include #include #include using namespace std; static void answer(const string& s) { cout << "! " << s << '\n'; cout.flush(); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; if (!(cin >> N)) return 0; vector q(N - 1); for (int i = 0; i < N - 1; ++i) { cout << "? " << i << ' ' << N - 1 << '\n'; cout.flush(); cin >> q[i]; if (q[i] == -1) return 0; } vector pos; for (int i = 0; i < N - 1; ++i) { if (q[i] > 0) pos.push_back(i); } auto make_string = [&](const vector& d) { string s; s.reserve(N); for (int i = N - 1; i >= 0; --i) s.push_back(char('0' + d[i])); return s; }; if (pos.empty()) { answer("-1"); return 0; } if (pos.size() == 1) { int k = pos[0]; int prod = q[k]; string only; int cnt = 0; for (int low = 1; low <= 9; ++low) { for (int high = 1; high <= 9; ++high) { if (low * high != prod) continue; vector d(N, 0); d[k] = low; d[N - 1] = high; only = make_string(d); ++cnt; } } if (cnt == 1) answer(only); else answer("-1"); return 0; } int a = pos[0]; int b = pos[1]; cout << "? " << a << ' ' << b << '\n'; cout.flush(); int r; cin >> r; if (r == -1) return 0; string only; int cnt = 0; for (int top = 1; top <= 9; ++top) { if (q[a] * q[b] != top * top * r) continue; vector d(N, 0); d[N - 1] = top; bool ok = true; for (int i = 0; i < N - 1; ++i) { if (q[i] % top != 0) { ok = false; break; } d[i] = q[i] / top; if (d[i] < 0 || d[i] > 9) { ok = false; break; } } if (!ok) continue; only = make_string(d); ++cnt; } if (cnt == 1) answer(only); else answer("-1"); return 0; }