#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; } void answer_num(const string& s) { cout << "! " << s << '\n'; cout.flush(); exit(0); } void answer_minus_one() { cout << "! -1\n"; cout.flush(); exit(0); } long long isqrt_ll(long long x) { long long r = sqrt((long double)x); while ((r + 1) * (r + 1) <= x) ++r; while (r * r > x) --r; return r; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; if (N == 1) { answer_minus_one(); } vector>> fac(82); for (int a = 1; a <= 9; ++a) { for (int b = 1; b <= 9; ++b) { fac[a * b].push_back({a, b}); // ordered pair (other digit, msd) } } int msd = N - 1; vector p(N, 0); vector pos; for (int i = 0; i < N - 1; ++i) { p[i] = ask(i, msd); if (p[i] > 0) pos.push_back(i); } vector d(N, 0); if ((int)pos.size() >= 2) { int a = pos[0], b = pos[1]; long long pab = ask(a, b); long long sq = p[a] * p[b] / pab; long long lead = isqrt_ll(sq); d[msd] = (int)lead; for (int i = 0; i < N - 1; ++i) { d[i] = (int)(p[i] / lead); } string ans; for (int i = N - 1; i >= 0; --i) ans.push_back(char('0' + d[i])); answer_num(ans); } if ((int)pos.size() == 1) { int i = pos[0]; if ((int)fac[p[i]].size() == 1) { auto [x, y] = fac[p[i]][0]; d[i] = x; d[msd] = y; string ans; for (int j = N - 1; j >= 0; --j) ans.push_back(char('0' + d[j])); answer_num(ans); } else { answer_minus_one(); } } answer_minus_one(); return 0; }