CF1665D GCD Guess

题目描述

这是一个交互题。 你需要猜测一个正整数 $1 \le x \le 10^9$。 在一次询问中,你可以选择两个正整数 $a \neq b$。对于这次询问,你将得到 $ \gcd(x + a, x + b) $ 的结果,其中 $ \gcd(n, m) $ 表示 $n$ 和 $m$ 的最大公约数。 为了猜出隐藏的数字 $x$,你最多可以进行 $30$ 次询问。

输入格式

输入的第一行包含一个整数 $t$($1 \le t \le 1000$),表示测试用例的数量。 你需要猜测的整数 $x$ 满足约束条件:$1 \le x \le 10^9$。

输出格式

隐藏的数字 $x$ 在交互开始前已经固定,并且不会因为你的询问而改变。 对于每个 $x$,你最多可以进行 $30$ 次询问,格式如下: - "? a b"($1 \le a, b \le 2 \cdot 10^9$,$a \neq b$) 对于该询问,你将得到 $ \gcd(x + a, x + b) $ 的结果。 当你确定 $x$ 时,输出一行,格式如下: - "! x"($1 \le x \le 10^9$) 之后继续解决下一个测试用例。 如果你对某个 $x$ 询问超过 $30$ 次,或者进行了非法的询问,交互器会立即终止,你的程序将收到 Wrong Answer 的判定。 每次输出询问后,不要忘记输出换行并刷新输出缓冲区。否则,你将收到 Idleness limit exceeded 的判定。刷新输出的方法如下: - C++:fflush(stdout) 或 cout.flush() - Java:System.out.flush() - Pascal:flush(output) - Python:stdout.flush() - 其他语言请查阅相关文档。 Hack 数据 要使用 Hack,请使用如下格式的测试数据: 第一行包含一个整数 $t$($1 \le t \le 1000$)——测试用例数量。 每个测试用例的第一行包含一个整数 $x$($1 \le x \le 10^9$),表示需要被猜测的整数 $x$。

说明/提示

第一个隐藏数字是 $4$,因此对于以下询问,答案分别为: "? 1 2" —— $ \gcd(4 + 1, 4 + 2) = \gcd(5, 6) = 1 $。 "? 12 4" —— $ \gcd(4 + 12, 4 + 4) = \gcd(16, 8) = 8 $。 第二个隐藏数字是 $10^9$,因此对于以下询问,答案为: "? 2000000000 1999999999" —— $ \gcd(3 \cdot 10^9, 3 \cdot 10^9 - 1) = 1 $。 这些询问仅用于帮助理解交互过程,并不足以确定真实的 $x$。 由 ChatGPT 4.1 翻译