/* -*- coding: utf-8 -*- * * 3501.cc: No.3501 Digit Products 2 - yukicoder */ #include #include #include using namespace std; /* constant */ const int MAX_N = 51; /* typedef */ using vi = vector; /* global variables */ int tts[81 + 1], ps[MAX_N], xs[MAX_N]; /* subroutines */ int query(int a, int b) { if (a > b) swap(a, b); printf("? %d %d\n", a, b); fflush(stdout); int p; scanf("%d", &p); if (p < 0) exit(0); return p; } void answer(int n, int xs[]) { if (n > 0) { printf("! "); for (int i = 0; i < n; i++) printf("%d", xs[i]); putchar('\n'); } else puts("! -1"); fflush(stdout); } /* main */ int main() { tts[1] = 1, tts[25] = 5, tts[49] = 7, tts[64] = 8, tts[81] = 9; int n; scanf("%d", &n); ps[0] = -1; vi vs(1, 0); for (int i = 1; i < n; i++) { ps[i] = query(0, i); if (ps[i] > 0) vs.push_back(i); } int m = vs.size(); if (m <= 1) { answer(-1, xs); } else if (m == 2) { int p = query(vs[0], vs[1]); if (tts[p] > 0) { xs[vs[0]] = xs[vs[1]] = tts[p]; answer(n, xs); } else answer(-1, xs); } else { // m >= 3 int p1 = ps[vs[1]], p2 = ps[vs[2]]; int p3 = query(vs[1], vs[2]); bool ok = false; for (int x0 = 1; ! ok && x0 <= 9; x0++) if (p1 % x0 == 0 && p2 % x0 == 0) { int x1 = p1 / x0, x2 = p2 / x0; if (x1 <= 9 && x2 <= 9 && x1 * x2 == p3) { ok = true; xs[vs[0]] = x0; for (int i = 1; ok && i < m; i++) { xs[vs[i]] = ps[vs[i]] / x0; ok = (ps[vs[i]] % x0 == 0 && xs[vs[i]] <= 9); } } } answer(n, xs); } return 0; }