在游览希尔万沙宫殿(Palace of Shirvanshahs)时,你迷路了,并发现自己处于一个奇妙的环形陷阱中。该陷阱由 $n$ 个完全相同的房间组成。我们将所有房间从 $0$ 到 $n - 1$ 进行编号。每个房间恰好有一扇敞开的门通往下一个房间,即对于 $i = 0, 1, \dots, n - 2$,房间 $i$ 中的门通往房间 $i + 1$,而房间 $n - 1$ 中的门通往房间 $0$。在你穿过一扇门后,它会在你身后关闭,因此你无法返回。最开始,你位于某个房间 $p$,但由于所有房间都是完全相同的,你并不知道具体是哪一个。你需要到达房间 $0$ 并在那里等待救援,以便逃离陷阱。幸运的是,你收到了一个可以指示到房间 $0$ 距离的设备。它会告诉你,你是否可以通过穿过不超过 $\frac{n}{2}$ 扇门到达房间 $0$。在设备电量耗尽之前,你最多可以使用它 35 次。
实现细节
你需要实现以下函数。评测程序(grader)将在每个测试点中调用它一次。
void escape(int n)
n:房间的数量。- 在该函数执行完毕后,你应当位于房间 $0$。
上述函数可以调用以下函数:
bool jump(int x)
x:在使用设备之前,你想要穿过的门的数量。$x$ 的值必须在 $0$ 到 $n - 1$ 之间(含边界)。- 该函数返回
true如果在穿过 $x$ 扇门后,你可以在穿过不超过 $\frac{n}{2}$ 扇门的情况下到达房间 $0$;否则返回false。请注意,在您使用设备之前,您的位置已经发生了改变。 - 你最多可以调用此函数 35 次。
数据范围
- $2 \le n \le 10^9$
- $1 \le p < n$
- 评测程序是非适应性(not adaptive)的。这意味着评测程序在
escape函数执行之前就已经确定了 $p$ 的值,并且在执行过程中不会改变它。
子任务
- (11 分)$n \le 30$
- (33 分)对于某个 $k$,$n = 2^k - 1$
- (56 分)无附加限制
样例
评测程序进行以下函数调用:
escape(10)
共有 $n = 10$ 个房间。假设你从房间 $p = 5$ 开始。让我们考虑以下对 jump 函数的调用:
jump(3):你现在位于房间 8。你需要穿过 2 扇门才能到达房间 0,这小于 $\frac{n}{2} = 5$,因此该函数返回true。jump(2):你现在位于房间 0,你可以留在这里,但并非必须如此。该函数将返回true,因为你不需要穿过任何门即可到达房间 0。jump(3):你现在位于房间 3。你需要穿过 7 扇门才能到达房间 0,因此该函数将返回false。jump(1):你现在位于房间 4。你需要穿过 6 扇门才能到达房间 0,因此该函数再次返回false。jump(6):你现在位于房间 0。如上所述,该函数将返回true。
在这些调用之后,你最终将停留在房间 0,该测试点将被判定为正确。
样例评测程序
样例评测程序按以下格式读取输入:
- 第 1 行:$n \ p$
如果你的解决方案成功结束,且最后你位于房间 0,样例评测程序将在标准输出中打印单行 OK,并在标准错误流中打印单行,其中包含对 jump 函数的调用次数。否则,样例评测程序将在标准输出中打印你的解决方案失败的原因。