这是一个交互式问题。
在膨胀省,有 $n=300$ 名学生参加了膨胀 OI 2026。其中,一些人获得了金牌,而另一些人则没有。
膨胀省的学生有一个奇怪的习惯。如果他们没有赢得金牌,他们会诚实地说他们没有赢得。然而,如果他们赢了,他们会以一定的概率说他们赢了,而另一种概率是他们说他们没有赢得。请注意,每次回答都是随机的,与之前的一次无关。
你作为膨胀省的教练,想知道每个学生是否获得了金牌。然后你可以让 Una 执行以下操作:
- 选择一些不同的学生,让 Una 询问他们是否获得了金牌。Una 会告诉你回答“是”的人数。
2025 年膨胀 OI 的金牌分数线是 571,所以你应该平均在不超过 568 次查询内找到答案。
由于膨胀 OI 的限制,你可以假设恰好有 48 名学生获得了金牌。
图 1:教练询问学生隐藏了多少分。
交互协议
这是一个交互式问题。请记住在每次打印后刷新输出缓冲区。要刷新输出,你可以使用:
- C/C++ 中的
fflush(stdout)或cout.flush(); - Java 和 Kotlin 中的
System.out.flush(); - Python 中的
sys.stdout.flush()。
首先,你应该读取一个整数 $T$($T=20$),表示测试用例的数量。
对于每个测试用例,你应该读取一个整数 $n$($n=300$),表示学生数量。
要进行一次查询,你应该输出一行格式为 ? k P1 P2 ... Pk 的字符串($1 \le P_i \le n$,且 $P_i \ne P_j$ 对于 $1 < i < j \le k$)。
然后,读取一个整数,表示 Una 找到的答案。如果你的查询无效,或者你总共进行了超过 $568T$ 次查询,则陪审团程序将输出 -1。读取 -1 后,你应该立即退出,以避免未定义行为。
如果你得到了答案,你应该输出一行格式为 ! s1 s2 ... sn 的字符串,其中 $s_i=1$ 表示第 $i$ 名学生获得了金牌,否则为 0。
然后,读取一个单词 OK 或 WA,表示你的答案是否正确。如果你的程序读取到 WA,你应该立即退出,以避免未定义行为。
请注意,评分程序不是自适应的,也就是说答案在你的查询后不会改变。最多有 10 个测试用例。
样例
| standard input | standard output |
|---|---|
| 1 | ? 2 1 2 |
| 2 | ? 1 1 |
| 0 | ? 1 2 |
| 0 | ! 0 1 |
| 1 | |
| OK |
说明
请注意,此示例仅供参考,它不满足 $T=20$ 和 $n=300$,并且不会出现在最终测试中。
提供了一个测试工具来帮助参赛者开发和测试他们的解决方案。你可以从附件中下载此工具。使用 "-h" 选项执行该工具应该会描述如何使用该工具。测试工具只会实现一些测试场景和真实评分程序的部分功能。