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$ 组。