P13107 [GCJ 2019 #1A] Golf Gophers
题目描述
去年,一群讨厌的地鼠在我们的果园里安了家。我们试图转行,开了一家迷你高尔夫球场,但看起来地鼠们又跟着我们来了!我们再次需要弄清楚有多少只地鼠,但我们无法直接观察它们,因为它们很隐秘且是夜行性动物,而我们喜欢晚上睡觉。我们只知道地鼠的数量在 $1$ 到 $M$ 之间(包含两端)。
我们的迷你高尔夫球场以每个球洞上都有一个小型电子风车而闻名,一共 18 个球洞。第 $i$ 个风车有 $2 \leqslant \mathbf{B}_{\mathrm{i}} \leqslant 18$ 片叶片,编号从 $0$ 到 $\mathbf{B}_{\mathrm{i}}-1$,顺时针排列。每天晚上,睡觉前我们会关闭所有风车,并将每个风车设置为 0 号叶片朝下,这样风车才能为第二天正常充电。然而,我们注意到,早上醒来时风车的位置已经被扰乱。由于我们的球场没有风,所以我们认为一定是这些调皮的地鼠搞的鬼!
我们知道,每天晚上,所有地鼠都会依次出现;每只地鼠会独立且等概率地选择一个风车,并将其逆时针旋转一片叶片。例如,对于一个有 3 片叶片、0 号叶片朝下的风车,第一只地鼠会让 1 号叶片朝下,之后每有一只地鼠操作该风车,朝下的叶片编号依次变为 2、0、1,依此类推。
我们已经想好了一个计划。我们的风车设计允许我们轻松更改叶片数量(以调整球场难度),现在我们要利用这一点!每天晚上睡觉前,我们可以为每个风车选择叶片数量,范围在给定的限制内;我们不需要每晚为每个风车选择相同的叶片数,也不需要每晚都做相同的选择。第二天早上,我们会观察每个风车朝下的叶片编号。
我们有 $\mathbf{N}$ 个夜晚来推断出 $\mathbf{G}$,即地鼠的数量。你能帮我们吗?
### 交互协议
这是一个交互题。
最开始,你的程序应读取一行,包含三个整数 $\mathbf{T}$、$\mathbf{N}$ 和 $\mathbf{M}$,分别表示测试用例数量、每个用例允许的夜晚数和地鼠数量的最大值。然后,你需要处理 $\mathbf{T}$ 个测试用例。
在每个测试用例中,你的程序最多与评测器进行 $\mathbf{N}+1$ 次交互。你可以进行最多 $\mathbf{N}$ 次如下形式的交互:
- 你的程序输出一行 18 个整数,每个整数在 2 到 18 之间(包含),第 $i$ 个数表示你希望第 $i$ 个风车当晚拥有的叶片数。
- 评测器返回一行 18 个整数,第 $i$ 个数表示早上第 $i$ 个风车朝下的叶片编号(经过地鼠捣乱后)。如果你输出了非法数据(如超出范围的数字或格式错误),评测器会返回 -1。
每个夜晚,对于每只地鼠,选择哪个风车是独立且等概率的(伪)随机选择,与其他地鼠(包括自己)在任何夜晚的选择都无关。
在进行 0 到 $\mathbf{N}$ 次上述交互后,你必须再进行一次如下形式的交互:
- 你的程序输出一个整数,表示你猜测的地鼠数量 $\mathbf{G}$。
- 评测器返回一行一个整数:如果你的答案正确则为 1,否则为 -1(或你输出了格式错误的行)。
当评测器向你的输入流发送 -1(因为数据非法或答案错误)后,不会再发送其他输出。如果你的程序在收到 -1 后仍然等待评测器输出,将会超时(TLE)。请注意,你有责任在收到 -1 后及时退出,以获得 Wrong Answer 判决而不是 Time Limit Exceeded。如果超出内存限制或发生运行时错误,将获得相应的判决。
输入格式
见交互协议。
输出格式
见交互协议。
说明/提示
**交互样例**
本交互对应于测试集 1。假设评测器实际设定的地鼠数量为 10。
```
t, n, m = readline_int_list() // 读取 t=20, n=365, m=100。
// 第一天选择风车叶片数。
printline 2 2 2 2 18 3 3 3 3 3 3 4 4 4 4 5 2 2 到标准输出
flush stdout
// 读取 0 0 0 0 0 0 1 2 1 0 1 2 0 0 0 0 1 0 到 res。
res = readline_int_list()
// 第二天选择风车叶片数。
printline 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 到标准输出
flush stdout
// 读取 0 1 1 2 0 0 1 0 0 0 0 0 0 1 0 0 0 0 到 res。
res = readline_int_list()
printline 8 到标准输出 // 我们做了一个错误的猜测,尽管还可以调查 363 个夜晚。
flush stdout
// 读取 -1 到 verdict(评测器判定我们的解答错误)
exit // 退出以避免 TLE 错误
```
注意,即使猜测与已知信息一致,如果不是正确答案,依然会判错。
你可以使用本题的测试工具在本地或平台上测试。若要在本地测试,你需要让测试工具与代码并行运行;你可以使用我们的 [interactive runner](https://storage.googleapis.com/coding-competitions.appspot.com/interactive_runner.py)。更多信息请阅读该文件注释中的说明。
测试工具的使用说明已包含在工具注释中。我们鼓励你添加自己的测试用例。请注意,虽然测试工具旨在模拟评测系统,但它**不是**真实的评测系统,可能会有不同表现。
**数据范围**
- $1 \leqslant \mathrm{T} \leqslant 20$。
**测试集 1(11 分,可见)**
- $\mathrm{N}=365$。
- $\mathrm{M}=100$。
**测试集 2(21 分,隐藏)**
- $\mathrm{N}=7$。
- $\mathrm{M}=10^{6}$。
由 ChatGPT 4.1 翻译