N = int(input()) def bisearch(f, n): l = 0 r = n fl = f(l) fr = f(r) while l <= r: m = (l + r) // 2 fm = f(m) if fm == n: return m elif fm > n: r = m - 1 fr = f(r) else: l = m + 1 fl = f(l) def try_square_root(n2): return bisearch(lambda n: n * n, n2) def solve(n): A = [] I = [] count = 0 for i in range(n - 1): print(f"? {i} {n-1}") a = int(input()) A.append(a) if a > 0: count += 1 I.append(i) if count == 0: print("! -1") return if count == 1: prod = A[I[0]] if prod not in [1, 25, 49, 64, 81]: print("! -1") return x = try_square_root(prod) d = [0] * n d[I[0]] = x d[n - 1] = x print("! ", end="") for i in reversed(range(n)): print(d[i], end="") print() return print(f"? {I[0]} {I[1]}") a = int(input()) xl = try_square_root(A[I[0]] * A[I[1]] // a) print("!", xl, end="") for i in reversed(range(n - 1)): print(A[i] // xl, end="") print() solve(N)