#M14. Guessing With GCDs

Guessing With GCDs

Background

这是一道交互题。

Description

你需要猜出一个正整数 x(1x106)x\quad(1\leq x\leq 10^6) 的值。你可以索求不超过 2020 次信息。每次索求信息时你可以给出两个不同的正整数 a,b(1a,b109)a,b\quad(1\leq a,b\leq 10^9) 并获得 gcd(x+a,x+b)\gcd(x+a,x+b) 的值。其中 gcd\gcd 表示最大公约数。

本题有多组数据。换句话说,你要解决很多轮这样的问题。每轮之间相互独立,换句话说,无论前一轮的交互情况如何,下一轮都是 2020 次以内的信息索求机会,但 xx 值不一定相同。每一轮的交互流程合规,回答都正确,本测试数据点才算通过。

Format

你可以通过如下输出来索求信息:

  • ? a b,表示询问 gcd(x+a,x+b)\gcd(x+a,x+b).

你可以通过如下输出来反馈答案:

  • ! x,表示你猜出的这个正整数为 xx. 交互库将会将一个 0/1 值提供至输入。若你读取到 00,说明测试结束;若你读取到 11,说明即将开始下一轮猜数。单个数据点内轮数不超过 10001000.

每当你进行一次索求,或你反馈答案后,请立即刷新输出流。刷新输出流的方式如下:

  • Python 语言中,在 print 中指定 flush=True,即 print(...,flush=True).
  • C/C++ 语言中,使用 fflush(stdout);.

Samples

我们给出一种可能发生的交互情况。在本样例中,x=12x=12.

1
2
5
36
0
? 1 5
? 2 4
? 8 13
? 24 348
! 12

不保证样例中询问的信息可以严谨推出结果。

Limitation

1s, 256MiB.