#N0222. 沉着冷静【NOIP2023模拟赛T3】

沉着冷静【NOIP2023模拟赛T3】

题目描述

快乐交互!

33 按照 LK-99 论文做出来了 n n 块材料。这些材料从 1 1 n n 进行编号。

经过测试后,每块材料都有一个超导温度 AiA_i。有恰好两块成功材料的超导温度都是 yy,另外 n2n-2失败材料的超导温度都是 xxxyx\neq y

33 把这些材料弄乱了,他需要你帮忙找出那两块成功材料。

你可以使用实验室里的一台特殊的“超导温度测试仪”,每次你可以选择一些材料放进去,这台测试仪会告诉你“所有放进去的材料”的“超导温度的异或和”。这台仪器耗电太大了,目前 33 剩余的电费只够开启 1919 次,这需要你好好规划使用方法。

请使用最多 1919 次仪器,来帮助 33 找到两块成功材料的编号!

输入格式

输入第一行包含三个整数 n,x,yn,x,y,含义如题所述。

输出格式

你可以按照两种模式进行输出:

  • 确认:你需要输出一个字符 !,然后输出两个整数 p1p_{1}p2p_{2}p1<p2p_{1}\lt p_{2})—— 为两块成功材料的编号。三个内容之间需要空格隔开。当你这样输出后,你需要结束程序。
  • 测试:你需要输出一个字符 ?,接下来输出一个整数 cc1cn1\le c\le n)即你需要放入仪器的材料数量,紧接着需要输出 cc 个不同的正整数 p1,p2,,pcp_{1}, p_{2} , \dots, p_{c}1pin1\le p_{i}\le n)即你需要测试的材料编号。同样的,所有内容之间需要空格隔开。
    • 当你输出测试内容后,交互器会给你一个测试结果,你需要输入这个整数。
    • 注意你最多只能测试 1919 次。如果你测试次数超过 1919 次或者有错误格式的输出,你会得到一个 -1 的结果,然后 Wrong answer

请注意你在每次输出之后需要刷新缓冲区,否则你的输出只会停留在缓冲区,交互器无法得到你的输出,你也无法得到交互器的结果。

C++ 中,fflush(stdout);std::cout.flush();std::cout << std::flush; 都可以实现刷新缓冲区操作。(使用 std::cout << std::endl 换行时也会自动刷新缓冲区,但是 std::cout << '\n' 不会)

4 2 1
2
1
1
? 3 1 2 3
? 1 1
? 1 3
! 1 3

样例解释

样例的四块材料的超导温度分别为:1,2,1,21,2,1,2

样例输出给出了一种提问模式:

  • 第一个询问的答案是 121=21\oplus 2\oplus 1 = 2
  • 后面两个询问的答案都是 11

数据规模与约定

  • 对于 5%5\% 的数据:2n202\le n\le 20
  • 对于另外 5%5\% 的数据:保证两个成功材料相邻
  • 对于另外 15%15\% 的数据:保证 1n1001\le n\le 100
  • 对于另外 15%15\% 的数据:保证 1x,y21\le x,y\le 2
  • 2n10002\le n\le 1000 , 1x,y109 1\le x,y\le 10^{9}