#CF2077B. 寻找 OR 的和

寻找 OR 的和

B. 寻找 OR 的和
每个测试的时间限制:2 秒
内存限制:256 MB

题目描述

有两个隐藏的非负整数 xxyy0x,y<2300 \le x, y < 2^{30})。
你可以进行不超过 2 次如下形式的询问:

  • 选择一个非负整数 nn0n<2300 \le n < 2^{30})。
  • 评测机会返回 (nx)+(ny)(n | x) + (n | y) 的值,其中 | 表示按位或运算。

询问结束后,评测机会再给你另一个非负整数 mm0m<2300 \le m < 2^{30})。
你需要输出正确的 (mx)+(my)(m | x) + (m | y) 的值。


输入

每个测试包含多个测试用例。
第一行包含测试用例的数量 tt1t1041 \le t \le 10^4)。
接下来是每个测试用例的交互过程。


交互说明

每个测试用例中,有两个隐藏的整数 xxyy0x,y<2300 \le x, y < 2^{30})。
注意 xxyy 在不同测试用例中可能不同。

本题的交互器是非自适应的,即 xxyy 在交互过程中不会改变。

  • 询问:输出一行一个整数 nn0n<2300 \le n < 2^{30})。
  • 回答:你会收到一个整数,表示 (nx)+(ny)(n | x) + (n | y) 的值。

你最多可以进行 2 次询问

询问结束后,输出一行 !
然后你会收到一个整数 mm0m<2300 \le m < 2^{30})。
你必须输出一行,表示 (mx)+(my)(m | x) + (m | y) 的值。
这一行不算作询问,不计入询问次数。

之后,继续下一个测试用例。

如果你在一次交互中进行了超过 2 次询问,你的程序必须立即终止,结果将是 Wrong Answer
否则,如果继续从关闭的流中读取,可能会得到任意评测结果。


输出格式要求

每次询问后,请刷新输出缓冲区:

  • C++: fflush(stdout)cout.flush()
  • Java: System.out.flush()
  • Pascal: flush(output)
  • Python: stdout.flush()
  • 其他语言请参考文档。

Hack 格式

要 hack,请按照以下格式:

第一行:tt
接下来 tt 行,每行三个整数 x,y,mx, y, m0x,y,m<2300 \le x, y, m < 2^{30})。


示例

输入:

2

3

4

1

0

1

输出:

0

1

!

4

0

!

2

注意:示例中的空行仅为清晰起见,实际交互中不会出现空行。


样例解释

  • 第一个测试用例x=1,y=2x=1, y=2

    • 询问 n=0n=0,得到 (01)+(02)=1+2=3(0|1)+(0|2)=1+2=3
    • 询问 n=1n=1,得到 (11)+(12)=1+3=4(1|1)+(1|2)=1+3=4
    • 输出 !,收到 m=1m=1
    • 输出 (11)+(12)=4(1|1)+(1|2)=4
  • 第二个测试用例x=0,y=0x=0, y=0

    • 询问 n=0n=0,得到 (00)+(00)=0(0|0)+(0|0)=0
    • 输出 !,收到 m=1m=1
    • 输出 (10)+(10)=2(1|0)+(1|0)=2