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 < 2: if n == 2 and A[0] == 1: print("11") return print("! -1") 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)