CF1534E Lost Array
题目描述
这是一个交互题。
注意:一个数组 $a_1, a_2, \ldots, a_n$($1 \le a_i \le 10^9$)的异或和被定义为 $a_1 \oplus a_2 \oplus \ldots \oplus a_n$,其中 $\oplus$ 表示[按位异或操作](https://en.wikipedia.org/wiki/Bitwise_operation#XOR)。
Little Dormi 收到了一份长度为 $n$ 的整数数组 $a_1, a_2, \ldots, a_n$ 作为圣诞礼物。然而,在寒假玩耍时,他不小心把它掉进了他的异或机,结果数组丢失了。
异或机当前配置的查询大小为 $k$(你无法更改),它允许你进行如下类型的查询:你可以给出 $k$ 个互不相同的下标 $x_1, x_2, \ldots, x_k$,机器会输出 $a_{x_1} \oplus a_{x_2} \oplus \ldots \oplus a_{x_k}$。
作为 Little Dormi 的哥哥,你想帮他通过查询异或机,恢复整个数组 $a_1, a_2, \ldots, a_n$ 的异或和。
Little Dormi 没有耐心,所以你必须用最少的查询次数找到异或和。形式化地,设 $d$ 为在查询大小为 $k$ 的情况下,恢复任意长度为 $n$ 的数组异或和所需的最小查询次数。只要你在不超过 $d$ 次查询内找出正确的异或和,你的程序就会被接受。
最后,你还注意到,对于某些 $k$ 和 $n$ 的配置,可能无法恢复 Little Dormi 丢失的数组的异或和。如果是这种情况,你也需要报告。
数组 $a_1, a_2, \ldots, a_n$ 在你开始查询前已经固定,并且在查询过程中不会改变。
输入格式
输入仅一行,包含整数 $n$ 和 $k$($1 \le n \le 500$,$1 \le k \le n$),分别表示丢失数组的长度和异或机的查询大小。
原始数组的元素满足 $1 \le a_i \le 10^9$。
可以保证,如果在给定约束下可以恢复异或和,则最多只需 $500$ 次查询,即 $d \le 500$。
在读入 $n$ 和 $k$ 后,开始交互。
输出格式
如果无法恢复数组的异或和,读入 $n$ 和 $k$ 后应立即输出 $-1$,并且不要开始交互。
否则,当你的程序找到了丢失数组 $a_1, a_2, \ldots, a_n$ 的异或和后,应按以下格式报告答案:“! x”,其中 $x$ 是数组 $a_1, a_2, \ldots, a_n$ 的异或和,并在输出后立即刷新输出流并正常终止程序。
注意,输出答案不计入查询次数。
交互说明
每次查询的格式为“? b”,其中 $b$ 是一个恰好包含 $k$ 个互不相同的 $1$ 到 $n$ 的整数,表示你想查询的数组下标。
你将收到一个整数 $x$,表示所查询元素的异或和。可以保证 $0 \le x \le 2 \cdot 10^9$。
每次输出查询后,不要忘记输出换行并刷新输出流,否则会导致 Idleness limit exceeded。具体做法如下:
- C++:fflush(stdout) 或 cout.flush()
- Java:System.out.flush()
- Pascal:flush(output)
- Python:stdout.flush()
- 其他语言请查阅相关文档
如果你进行了一次非法查询,或查询次数超过 $500$(这是硬性上限),交互将立即终止并返回 Wrong Answer。注意,如果你超过了 $d$ 次查询,交互仍会继续,除非你也超过了 $500$ 次查询的硬性上限,但你仍会收到 Wrong Answer。
Hack 格式
要 hack 一个解答,使用如下格式:
第一行包含整数 $n$ 和 $k$($1 \le n \le 500$,$1 \le k \le n$)。
第二行包含数组 $a_1, a_2, \ldots, a_n$($1 \le a_i \le 10^9$)。
说明/提示
在第一个交互样例中,数组 $a_1, a_2, \ldots, a_n$ 为 $2, 1, 7, 5, 6$,其异或和为 $7$。
第一次查询索引 $1,2,3$,返回 $a_1 \oplus a_2 \oplus a_3 = 2 \oplus 1 \oplus 7 = 4$。
第二次查询索引 $2,3,5$,返回 $a_2 \oplus a_3 \oplus a_5 = 1 \oplus 7 \oplus 6 = 0$。
第三次查询索引 $4,1,5$,返回 $a_4 \oplus a_1 \oplus a_5 = 5 \oplus 2 \oplus 6 = 1$。注意索引顺序可以任意。
此外,虽然样例中进行了三次查询,但这只是为了演示交互格式,并不一定代表最优策略。
在第二个交互样例中,无论如何都无法恢复 Little Dormi 的数组异或和,因此程序应立即输出 $-1$ 并退出。
由 ChatGPT 4.1 翻译