P16914 [JLCPC 2026] 隐藏的 k 元组

题目描述

**这是一个交互题。** 有一个隐藏的划分,将整数 $1, 2, \ldots, n$ 分成 $\dfrac{n}{k}$ 个互不相交的 $k$ 元组。保证 $n$ 是 $k$ 的倍数。你需要通过询问找出所有隐藏的 $k$ 元组。 一次询问中,你可以选择一个集合 $S \subseteq \{1, 2, \ldots, n\}$,交互库会返回一个整数,表示有多少个隐藏的 $k$ 元组被**完整包含**在 $S$ 中。 你的询问次数不能超过 $n \times \lceil \log_2 n \rceil$ 次。 > $\lceil \cdot \rceil$ 是上取整符号,$\lceil x \rceil$ 表示不小于 $x$ 的最小整数。例如 $\lceil 7 \rceil = 7$,$\lceil 3.14 \rceil = 4$。

输入格式

程序开始时,交互库会输出一行两个整数 $n$ 和 $k$($2 \le n \le 300$,$2 \le k \le n$,并且 $n$ 是 $k$ 的倍数)。 隐藏的划分由交互库保存,不会直接给出。 在你每次输出一次合法询问之后,交互库会返回一行一个整数 $r$,表示有多少个隐藏的 $k$ 元组被完整包含在你询问的集合中。

输出格式

你可以进行如下形式的询问: $$\texttt{? c $x_1$ $x_2$ $\ldots$ $x_c$}$$ 其中 $0 \le c \le n$,且 $x_1, x_2, \ldots, x_c$ 必须是两两不同的整数,满足 $1 \le x_i \le n$。 该询问表示你选择集合 $S=\{x_1,x_2,\ldots,x_c\}$。交互库会返回一个整数 $r$,表示有多少个隐藏的 $k$ 元组被完整包含在 $S$ 中。 当你确定答案后,需要输出: $$\texttt{! $a_1$ $a_2$ $\ldots$ $a_n$}$$ 其中 $a_i$ 表示元素 $i$ 所在的元组编号。编号必须满足 $1 \le a_i \le \dfrac{n}{k}$。如果两个元素属于同一个隐藏元组,则它们的编号必须相同;如果两个元素属于不同隐藏元组,则它们的编号必须不同。元组编号的顺序可以任意。 你的询问次数不能超过 $n \times \lceil \log_2 n \rceil$ 次。输出最终答案后,你的程序应立即结束。 注意,每次输出询问或最终答案后都必须刷新输出缓冲区。例如,在 C++ 中可以使用 `fflush(stdout)` 或 `cout

说明/提示

在下面的例子中,$n = 6$,$k = 2$,隐藏的元组为 $\{1, 3\}$、$\{2, 6\}$、$\{4, 5\}$。 $$ \def\arraystretch{1.5} \begin{array}{|l|c|} \hline \textbf{程序} & \textbf{交互库} \\ \hline & \verb!6 2! \\ \hline \verb!? 3 1 3 5! & \verb!1! \\ \hline \verb!? 4 2 3 4 5! & \verb!1! \\ \hline \verb!? 6 1 2 3 4 5 6! & \verb!3! \\ \hline \verb|! 1 2 1 3 3 2| & \\ \hline \end{array} $$ - 询问 $\{1,3,5\}$:元组 $\{1,3\} \subseteq S$,答案为 $1$。 - 询问 $\{2,3,4,5\}$:元组 $\{4,5\} \subseteq S$,答案为 $1$。 - 询问 $\{1,2,3,4,5,6\}$:三个元组都被包含,答案为 $3$。 - 输出 $[1, 2, 1, 3, 3, 2]$ 表示:元素 $1, 3$ 组成第 $1$ 组;元素 $2, 6$ 组成第 $2$ 组;元素 $4, 5$ 组成第 $3$ 组。