from random import randint from sys import exit from math import gcd p = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139] def suspect(a, s, d, n): x = pow(a, d, n) if x == 1: return True for _ in range(s): if x == n - 1: return True x = x * x % n return False def is_prime(n): if n <= 1: return False if n <= 140: return n in p if (n & 1) == 0: return False d = n - 1 s = 0 while (d & 1) == 0: s += 1 d >>= 1 for i in p: if not suspect(i, s, d, n): return False return True def answer(p): q = n // p assert is_prime(p) and is_prime(q) for x, r in query: assert pow(x, r, n) == 1 print('!', p, q) exit(0) n = int(input()) query = [] assert n <= 1 << 1024 and n & 1 while True: x = randint(2, n - 2) if gcd(n, x) > 1: answer(gcd(n, x)) print('?', x, flush = True) r = int(input()) query.append((x, r)) if r % 2 == 0: x = pow(x, r // 2, n) + 1 if x != n: answer(gcd(n, x))