N = int(input()) non_zero_digits = [N-1] answers = [-1]*N #i番目とN-1番目の積の結果が入った配列 for i in range(N-2, -1, -1): print("?", N-1, i, flush=True) p = int(input()) answers[i] = p if p != 0: non_zero_digits.append(i) if len(non_zero_digits) >= 3: print("?", non_zero_digits[1], non_zero_digits[2]) #最後の質問 highest_digit = answers[non_zero_digits[1]]*answers[non_zero_digits[2]]//int(input()) #最高位の2乗が求まる for i in range(1, 10): if i*i == highest_digit: highest_digit = i break ans = ["0" for k in range(N)] ans[N-1] = str(highest_digit) for i in range(1, len(non_zero_digits)): ans[non_zero_digits[i]] = str(answers[non_zero_digits[i]]//highest_digit) print("! " + "".join(ans[::-1])) elif len(non_zero_digits) == 2: temp = answers[non_zero_digits[1]] if temp == 1 or temp == 25 or temp == 49 or temp == 64 or temp == 81: for i in range(1, 10): if i*i == temp: ans = ["0" for k in range(N)] ans[non_zero_digits[0]] = str(i) ans[non_zero_digits[1]] = str(i) print("! " + "".join(ans[::-1])) break else: print("! -1") else: print("! -1")