#include using namespace std; long long ask(int a, int b) { cout << "? " << a << ' ' << b << '\n'; cout.flush(); long long p; cin >> p; if (p == -1) exit(0); return p; } void answer_string(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(); } int msd = N - 1; vector s(N, 0); vector pos_positive; for (int i = 0; i < N - 1; ++i) { s[i] = ask(i, msd); if (s[i] > 0) pos_positive.push_back(i); } if ((int)pos_positive.size() >= 2) { int a = pos_positive[0]; int b = pos_positive[1]; long long p = ask(a, b); long long sq = s[a] * s[b] / p; long long d_msd = isqrt_ll(sq); vector d(N, 0); d[msd] = (int)d_msd; for (int i = 0; i < N - 1; ++i) { d[i] = (int)(s[i] / d_msd); } string ans; for (int i = N - 1; i >= 0; --i) ans.push_back(char('0' + d[i])); answer_string(ans); } if ((int)pos_positive.size() == 1) { int a = pos_positive[0]; if (s[a] == 1) { vector d(N, 0); d[msd] = 1; d[a] = 1; string ans; for (int i = N - 1; i >= 0; --i) ans.push_back(char('0' + d[i])); answer_string(ans); } else { answer_minus_one(); } } answer_minus_one(); return 0; }