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 翻译