#include #include #define MAXN 55 long long ask(int a, int b) { printf("? %d %d\n", a, b); fflush(stdout); long long p; if (scanf("%lld", &p) != 1) exit(0); if (p == -1) exit(0); return p; } int main(void) { int N; if (scanf("%d", &N) != 1) return 0; long long q[MAXN]; int pos[MAXN]; int cntPos = 0; // 1) query all products with the most significant digit for (int i = 0; i <= N - 2; i++) { q[i] = ask(i, N - 1); if (q[i] > 0) pos[cntPos++] = i; } int d[MAXN] = {0}; if (cntPos >= 2) { // 2) ask one more question between two positive digits int i = pos[0]; int j = pos[1]; long long r = ask(i, j); // r = d_i * d_j long long val = (q[i] * q[j]) / r; // = L^2 int L = -1; for (int x = 1; x <= 9; x++) { if (1LL * x * x == val) { L = x; break; } } if (L == -1) { printf("! -1\n"); fflush(stdout); return 0; } d[N - 1] = L; for (int k = 0; k <= N - 2; k++) { d[k] = (int)(q[k] / L); } printf("! "); for (int k = N - 1; k >= 0; k--) { printf("%d", d[k]); } printf("\n"); fflush(stdout); return 0; } if (cntPos == 0) { // only the most significant digit is non-zero, impossible to determine printf("! -1\n"); fflush(stdout); return 0; } // cntPos == 1 { int idx = pos[0]; long long prod = q[idx]; int candL = -1, candD = -1; int ways = 0; for (int L = 1; L <= 9; L++) { if (prod % L != 0) continue; long long other = prod / L; if (1 <= other && other <= 9) { ways++; candL = L; candD = (int)other; } } if (ways != 1) { printf("! -1\n"); fflush(stdout); return 0; } for (int k = 0; k < N; k++) d[k] = 0; d[N - 1] = candL; d[idx] = candD; printf("! "); for (int k = N - 1; k >= 0; k--) { printf("%d", d[k]); } printf("\n"); fflush(stdout); } return 0; }