CF835E The penguin's game

题目描述

请注意:本题是交互题。 企鹅 Xoriy 最近想出了一个新游戏。他有编号从 $1$ 到 $n$ 的 $n$ 根冰锥。每根冰锥有一个温度——一个 $1$ 到 $10^{9}$ 之间的整数。其中恰好有两根是特殊的:它们的温度为 $y$,而其他冰锥的温度均为 $x \neq y$。你需要找出这两根特殊的冰锥。你可以选择一个非空的冰锥子集,并向企鹅询问该子集中冰锥温度的按位异或(XOR)值。注意,你最多只能提出 $19$ 个问题。 你的任务是找出这两根特殊的冰锥。

输入格式

第一行输入包含三个整数:$n,x,y\,(2 \le n \le 1000,\,1 \le x,y \le 10^{9},\,x \neq y)$,分别表示冰锥的数量、非特殊冰锥的温度和特殊冰锥的温度。

输出格式

为了向企鹅提交答案,你需要先输出字符 `!`,然后输出两个整数 $p_{1},p_{2}$(需要保证 $p_{1} < p_{2}$)表示按升序排列的特殊冰锥的编号。注意,`!` 和 $p_{1}$ 之间应有一个空格;两个编号之间也应有一个空格。提交答案后,你的程序应立即终止。 ### 交互方式 要提出一个问题,你需要输出字符 `?`、一个整数 $c\,(1 \le c \le n)$,以及 $c$ 个不同的整数 $p_{1},p_{2},\dots,p_{c}\,(1 \le p_{i} \le n)$ 表示你想询问的冰锥编号。注意,`?` 和 $c$ 之间应有一个空格;编号之间也应有一个空格。 提出问题后,你需要读取一个整数——企鹅的答案。 注意,你最多只能提出 $19$ 个问题。如果你提出的问题超过 $19$ 个或至少有一个问题无效,你的解答将被判为“错误答案”。 如果在某个时刻你的程序读取到 $-1$ 作为答案,它应立即退出(例如,通过调用 `exit(0)`)。这种情况下,你将得到“错误答案”,这意味着你提出的问题超过 $19$ 个或提出了无效问题。如果你忽略这一点,可能会因为程序继续从已关闭的流中读取而得到其他判定结果。 如果你的程序没有输出任何内容或忘记刷新输出(包括最终答案),将会被判为 `Idleness Limit Exceeded`。 刷新输出的方法(在输出后立即使用): - C++:`fflush(stdout)`; - Java:`System.out.flush()`; - Python:`stdout.flush()`; - Pascal:`flush(output)`; - 其他语言请参考相关文档。 ### Hack 如果要 Hack 他人,请使用以下格式输入: > $n$ $x$ $y$ $p_{1}$ $p_{2}$ 其中 $1 \le p_{1} < p_{2} \le n$ 是特殊冰锥的编号。 参赛者的程序将无法看到这些输入。

说明/提示

第一个问题的答案是 $1\oplus 2 \oplus 1 =2$。 第二个和第三个问题的答案是 $1$,因此特殊冰锥的编号是 $1$ 和 $3$。 你可以在这里了解更多关于按位异或操作的信息:。