评委选择了一个区间 $[1, n]$ 中的整数 $x$。你的任务是猜出这个数。为了避免盲目猜测,你可以进行询问。在每次询问中,你可以给出一个区间 $[0, c]$ 中的整数 $y$,我们将返回 $x + y$ 的约数个数作为回答。
为了增加难度,在单次程序运行中,你需要解决 $t$ 个测试用例。所有测试用例中允许询问的总次数限制为 $q$。
交互
这是一个交互式题目。你需要编写一个程序,通过提供的库与评委进行通信。要使用该库,请在你的程序中包含:
- C++:
#include "dzilib.h" - Python:
from dzilib import GetT, GetN, GetQ, GetC, Ask, Answer
该库提供以下函数:
GetT()– 返回参数 $t$ —— 需要解决的测试用例数量。GetN()– 返回参数 $n$ —— 隐藏值 $x$ 的上限。GetQ()– 返回参数 $q$ —— 所有 $t$ 个测试用例中允许询问的总次数限制。GetC()– 返回参数 $c$ —— 你可以给出的 $y$ 值的上限。Ask(y)– 返回隐藏值 $x$ 加上 $y$ 后的正约数个数。必须满足 $0 \le y \le c$。Answer(z)– 通知库你认为隐藏值 $x$ 为 $z$。该函数不返回任何值(在 C++ 中函数类型为void)。
在 Python 中,所有库函数的参数及返回值均为整数类型。在 C++ 中,函数接收和返回的类型与提供的示例库一致,详见“实验”部分。
在程序运行的任何时刻(程序结束前),只有一个测试用例处于激活状态。第一个测试用例在程序启动后立即激活。当测试用例处于激活状态时,你可以使用 Ask 函数进行询问。当你认为已知隐藏值 $x$ 时,可以使用 Answer 函数提交,库将对其进行验证。如果提交的值不正确,库将终止程序并给出“错误答案”的判决。如果值正确,函数将结束;如果该测试用例不是最后一个,则立即激活下一个测试用例。在回答完最后一个测试用例后,你应该结束程序。如果你没有这样做并尝试继续使用 Ask 或 Answer 函数,你将收到“错误答案”的判决。
你可以在程序运行的任何时刻使用 GetT、GetN、GetQ 和 GetC,且它们返回的值不会改变。这些函数不计入询问次数限制,但会消耗 CPU 时间。参数 $q$ 仅限制 Ask 函数的调用次数。一旦超过允许的总询问次数,库将终止程序,你将收到“错误答案”的判决。
不要从标准输入读取任何数据,也不要向标准输出写入任何内容。禁止任何试图影响评测库内部运作的行为。
库
所有测试中的隐藏值 $x$ 及其顺序是预先确定的。这意味着与你的程序通信的库不会是恶意的,也不会根据你的程序行为调整其行为。
题目中给出的限制仅针对你的程序所消耗的时间和内存。库的运行时间和内存消耗可能取决于测试用例以及你程序的具体行为。因此,SIO2 上的时间和内存限制略高于题目中给出的数值。
样例
输入格式 1
(交互库自动处理)
输出格式 1
(交互库自动处理)
说明
在样例测试中,$t = 2, n = 10^6, q = 10^4, c = 10^{15}$,隐藏值依次为 $1000$ 和 $1$。
| 被调用函数 | 结果 | 描述 |
|---|---|---|
GetT() |
$2$ | $t = 2$。 |
GetN() |
$1\,000\,000$ | $n = 10^6$。 |
GetQ() |
$10\,000$ | $q = 10^4$。 |
GetC() |
$1\,000\,000\,000\,000\,000$ | $c = 10^{15}$。 |
Ask(1) |
$8$ | $x + 1$ 有 $8$ 个约数:$1, 7, 11, 13, 77, 91, 143$ 和 $1001$。 |
Ask(24) |
$11$ | $x + 24$ 有 $11$ 个约数:$1, 2, 4, 8, 16, 32, 64, 128, 256, 512$ 和 $1024$。 |
Answer(1000) |
– | 回答正确,开始下一个测试用例。 |
GetT() |
$2$ | 合法询问 – 返回值不变。 |
Answer(1) |
– | 最后一个测试用例的正确回答示例。回答后应结束程序。 |
共进行了 $2$ 次 Ask 询问,在 $10\,000$ 次询问的限制内。请记住,询问次数限制是针对单次测试中所有测试用例的总和。
子任务
在同一组测试中,所有测试用例具有相同的 $t, n, q$ 和 $c$ 值,如下表所示:
| 组号 | $t$ | $n$ | $q$ | $c$ |
|---|---|---|---|---|
| 1 | 50 | $10^5$ | 50 000 | $10^{12}$ |
| 2 | 50 | $10^6$ | 5 000 | $10^{12}$ |
| 3 | 10 | $10^9$ | 50 000 | $10^{12}$ |
| 4 | 10 | $10^{14}$ | 5 000 | $10^{17}$ |
| 5 | 10 | $10^{14}$ | 2 000 | $10^{17}$ |
| 6 | 10 | $10^{14}$ | 1 300 | $10^{17}$ |
| 7 | 10 | $10^{14}$ | 950 | $10^{17}$ |
| 8 | 10 | $10^{14}$ | 820 | $10^{17}$ |
| 9 | 10 | $10^{14}$ | 750 | $10^{17}$ |
| 10 | 10 | $10^{14}$ | 720 | $10^{17}$ |
样例测试不属于任何组。你可以尝试解决它,但请注意,不解决它也有可能获得满分。
实验
示例错误解法及示例库位于 SIO2 的“文件”部分。这些解法和库展示了所有函数接收和返回的类型。示例库的行为可能与用于评测的库不同,且可能不满足题目要求。它们仅用于展示与程序的交互方式。
C++ 解法 dzi.cpp 可以通过以下命令编译:
g++ -O3 -static -o dzi dzi.cpp dzilib.cpp -std=c++20
请确保 dzilib.h 和 dzilib.cpp 文件与你的解法位于同一文件夹中。
Python 解法 dzi.py 可以通过以下命令运行:
python dzi.py
请确保 dzilib.py 文件与你的解法位于同一文件夹中。
程序启动后,库会从标准输入依次读取 $t, n, q$ 和 $c$ 的值,随后读取隐藏值 $x$。对应样例测试的输入文件在两个压缩包中均命名为 dzi0.in。