def question(i, j): print("?", i+1, j+1) return int(input()) def answer(A, B): print("!", *A, *B) def eratosthenes(n): sieve = [True] * (n + 1) for i in range(int(n**0.5) + 1): if i < 2: sieve[i] = False elif sieve[i]: for j in range(i, n//i + 1): sieve[i * j] = False ans = [] for i in range(n+1): if sieve[i]: ans.append(i) return ans N = int(input()) if N == 1: exit(answer([1], [1])) P = eratosthenes(N)[-1] res = [question(0, i) for i in range(N)] A0 = min(res) if A0 == 1: B = res[:] idx = B.index(1) A = [question(i, idx) for i in range(N)] answer(A, B) elif A0 == P: B = [] a, b = -1, -1 for i, n in enumerate(res): if n == P: if a == -1: a = i else: b = i B.append(-1) else: B.append(n//P) A = [question(i, a) for i in range(N)] if sorted(A) == list(range(1, N+1)): B[a] = 1 B[b] = P else: B[a] = P B[b] = 1 for i in range(1, N): if A[i] != P: A[i] //= P else: A[i] = 1 answer(A, B) else: idx = res.index(A0*P) A = [A0] a, b = -1, -1 for i in range(1, N): q = question(i, idx) if q == P: if a == -1: a = i else: b = i A.append(-1) else: A.append(q//P) B = [question(a, i) for i in range(N)] if sorted(B) == list(range(1, N+1)): A[a] = 1 A[b] = P else: A[a] = P A[b] = 1 a, b = -1, -1 for i in range(N): if B[i] == P: if a == -1: a = i else: b = i else: B[i] //= P q = question(A.index(1), a) if q == 1: B[a] = 1 else: B[b] = 1 answer(A, B)