CF1365G Secure Password
题目描述
这是一个交互题。
Ayush 又想出了一个设置密码的新方法。他的锁有 $n$ 个槽位,每个槽位可以放置任意非负整数。密码 $P$ 是一个长度为 $n$ 的整数序列,第 $i$ 个元素将放入锁的第 $i$ 个槽位。
为了设置密码,Ayush 构造了一个长度为 $n$ 的整数数组 $A$,每个元素都在区间 $[0, 2^{63}-1]$ 内。然后,他将密码 $P$ 的第 $i$ 个元素设置为数组中除了 $A_i$ 以外所有元素的按位或(bitwise OR)。
你需要猜出这个密码。你可以进行查询,每次可以选择数组的一个非空下标子集,询问这些下标对应元素的按位或。你最多可以进行 13 次查询。
输入格式
输入的第一行包含一个整数 $n$ $(2 \le n \le 1000)$,表示锁的槽位数。
输出格式
每次查询时,输出一行:
- 首先输出 "? c "(不含引号),其中 $c$ $(1 \leq c \leq n)$ 表示你查询的下标子集的大小,接着输出 $c$ 个互不相同的 $[1, n]$ 范围内的下标,空格分隔。
对于每次查询,你将收到一个整数 $x$,表示所查询下标对应元素的按位或。如果查询的下标子集无效或你超过了查询次数,则会收到 $x = -1$,此时你应立即终止程序。
当你猜出密码后,输出一行 "! "(不含引号),后接 $n$ 个空格分隔的整数,表示密码序列。
猜测密码不计入查询次数。
交互器是非自适应的。数组 $A$ 在所有查询中保持不变。
每次输出查询后,不要忘记输出换行并刷新输出缓冲区,否则会收到 Idleness limit exceeded 的错误。具体方法如下:
- C++:fflush(stdout) 或 cout.flush()
- Java:System.out.flush()
- Pascal:flush(output)
- Python:stdout.flush()
- 其它语言请查阅相关文档。
Hack 格式
要 hack 其他解法,请使用如下输入格式:
第一行输出一个整数 $n$ $(2 \le n \le 1000)$,表示锁的槽位数。第二行输出 $n$ 个空格分隔的整数,范围为 $[0, 2^{63} - 1]$,表示数组 $A$。
说明/提示
示例中数组 $A$ 为 $\{1, 2, 4\}$。密码的第一个元素是 $A_2$ 和 $A_3$ 的按位或,第二个元素是 $A_1$ 和 $A_3$ 的按位或,第三个元素是 $A_1$ 和 $A_2$ 的按位或。因此,密码序列为 $\{6, 5, 3\}$。
由 ChatGPT 4.1 翻译