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): if n % 2 == 0: print("! -1") return A = [] for i in range(n): print(f"? {i} {(i+1)%n}") a = int(input()) A.append(a) count = 1 for i in range(n): if i % 2 == 0: count *= A[i] for i in range(n): if i % 2 == 1: if count % A[i] == 0: count //= A[i] else: print("! -1") return sr = try_square_root(count) if sr is None: print("! -1") return X = [sr] for i in range(1, n): if X[i - 1] != 0 and A[i - 1] % X[i - 1] == 0: X.append(A[i - 1] // X[i - 1]) else: print("! -1") return print("! ", end="") for i in reversed(range(n)): print(X[i], end="") print() solve(N)