Alojzy 和 Bajtazar 正在玩一场竞拍游戏。游戏需要用到大量的棋子。玩家轮流进行操作:先是 Alojzy,然后是 Bajtazar,接着又是 Alojzy,以此类推。在游戏的任何时刻,有两个数值至关重要:当前的下注额和当前堆叠的棋子总数。游戏开始时,下注额为 1 枚棋子,堆叠为空。在每一轮中,玩家可以执行以下操作之一:
- 将下注额翻倍,
- 将下注额变为原来的三倍,
- 弃权(pass)。
如果玩家选择弃权,当前的全部下注额将移至堆叠中(这是增加堆叠棋子数量的唯一方式),竞拍重新从 1 枚棋子的下注额开始。如果玩家弃权,则下一轮由其对手进行(只有游戏开始时由 Alojzy 先手)。导致堆叠溢出的玩家(即当堆叠中的棋子达到 $n$ 枚或更多时)即为输家。如果在玩家操作前,堆叠中的棋子总数与当前下注额之和达到或超过 $n$,则该玩家不能再将下注额翻倍或变为三倍。他必须弃权,从而将下注额加入堆叠,导致其输掉比赛。
Alojzy 经常输掉比赛。Bajtazar 向他提出了一个有趣的挑战——与其亲自玩竞拍游戏,不如编写程序来玩。遗憾的是,Alojzy 不会编程。请帮助他!
请编写一个程序,代表 Alojzy 与 Bajtazar 编写的库进行竞拍游戏。
子任务
在所有测试用例中,你的程序只要执行正确的操作,就能够战胜库,无论库如何操作。只有当你战胜了库时,你的程序才能在该测试中获得分数。
在所有测试中,满足条件 $1 \leqslant n \leqslant 30\,000$。在 50% 的测试用例中,满足额外条件 $n \leqslant 25$。
交互
为了使用库,必须在程序开头包含:
- C/C++:
#include "cliclib.h" - Pascal:
uses pliclib;
库提供了以下函数和过程:
inicjuj— 返回数字 $n$。该函数应在程序开始时恰好调用一次。- C/C++:
int inicjuj(); - Pascal:
function inicjuj: longint;
- C/C++:
alojzy— 通知库你的程序所做的操作。其唯一参数是一个整数 $x$,表示所做的操作:$x = 1$ 表示弃权,$x = 2$ 表示将下注额翻倍,$x = 3$ 表示将下注额变为三倍。- C/C++:
void alojzy(int x); - Pascal:
procedure alojzy(x: longint);
- C/C++:
bajtazar— 该函数通知你的程序库所做的操作。它返回一个整数 $x$,表示所做的操作。与alojzy函数类似,$x = 1$ 表示弃权,$x = 2$ 表示翻倍,$x = 3$ 表示将下注额变为三倍。- C/C++:
int bajtazar(); - Pascal:
function bajtazar: longint;
- C/C++:
调用 inicjuj 函数后,必须交替调用 alojzy 和 bajtazar 函数(按此顺序)。违反通信协议将被视为错误回答,并导致该测试得 0 分。在本题中,禁止使用标准输入输出。任何通信都应仅通过上述函数和过程进行。库将在游戏结束后自动终止程序。
样例
| C/C++ | Pascal | 结果 | 堆叠 | 下注额 | 说明 |
|---|---|---|---|---|---|
n = inicjuj(); |
n := inicjuj; |
$15$ | $0$ | $1$ | 从此刻起 $n = 15$。 |
alojzy(2); |
alojzy(2); |
— | $0$ | $2$ | 你的程序将下注额翻倍。 |
bajtazar(); |
bajtazar; |
$2$ | $0$ | $4$ | 库回应了翻倍操作。 |
alojzy(3); |
alojzy(3); |
— | $0$ | $12$ | 你的程序将下注额变为三倍。 |
bajtazar(); |
bajtazar; |
$1$ | $12$ | $1$ | 库弃权。12 枚棋子进入堆叠,下注额重新变为 1。 |
alojzy(2); |
alojzy(2); |
— | $12$ | $2$ | 你的程序将下注额翻倍。 |
bajtazar(); |
bajtazar; |
$3$ | $12$ | $6$ | 库将下注额变为三倍。 |
alojzy(1); |
alojzy(1); |
— | $18$ | $1$ | 堆叠与下注额之和超过了 15。你的程序被迫弃权。 |
上述程序运行过程是正确的,但不是最优的。你的程序将不会在该测试中获得分数。特别地,对于 $n = 15$,Alojzy 有可能获胜,无论 Bajtazar 如何操作。