Description
小A和小B在玩飞行棋。
飞行棋的棋盘由一行 n+1 个格子组成,标号为 0~n。0 号格子为起点;n 号格子为终点。1 到 n-1 号格子上分别标有一个整数,记为a[i](1<=i<=n-1, -n<=a[i]<=n)。
双方各有两枚棋子。游戏开始时,所有棋子均在起点;当一枚棋子恰好到达终点时,该棋子不再移动,并离开棋盘;当一方两枚棋子均到达终点时,该方获得胜利,游戏结束。
游戏过程中,双方轮流掷骰子来移动棋子。记某方某次掷出的点数为 x (1<=x<=6),则其选择自己的一枚棋子,向前移动 x 格。若该棋子超过了终点,那么多出的步数棋子将会往回移动。(例如棋子超过了终点 3 格时,其最终将移动到 n-3 号格子)
对棋子掷骰子移动到的格子,记其上的数字为 z。则 z 的正负分别表示其还会向前或向后移动,绝对值表示其移动的距离;若 z 为 0 则原地不动。棋子此次移动后将结束移动。(题目保证棋子不会因此移出棋盘,也不会到达终点或起点)
棋子结束移动后,若其所在的格子有对方的棋子,那么所有在此格的对方棋子将被移回起点。
游戏开始时,小A先掷骰子。小A和小B走棋策略都是:轮流移动自己的两个棋子,除非其中一个棋子已经到达终点。
需要注意,在投掷骰子的过程中,掷得 6 点的玩家可以连续投掷骰子,直至点数不为 6 点或游戏结束。
我们使用下面给出的函数来模拟双方的掷骰子的情况:
unsigned int seed;
unsigned int _rand()
{
unsigned int value;
seed *= 1103515245;
seed += 12345;
value = (seed >> 16) & 0x07FF;
seed *= 1103515245;
seed += 12345;
value <<= 10;
value |= (seed >> 16) & 0x03FF;
seed *= 1103515245;
seed += 12345;
value <<= 10;
value |= (seed >> 16) & 0x03FF;
return value%6+1;
}
在输入了 seed 之后,每次调用 _rand() 函数时都会返回一个 1~6 的整数,我们使用它来模拟每一次掷骰子的结果。
小C想知道小A和小B谁能获胜。
Input
输入包含多组数据,以EOF结束。
每组数据包含两行。
第一行包含两个整数,依次为 n 和 seed,之间有一个空格隔开。(6<=n<=100,0<=seed<=1e9)
第二行包含 n-1 个整数 a[i],按照 i 从小到大的顺序给出,之间都有一个空格隔开。(1<=i<=n-1,-n<=a[i]<=n)
Output
每组数据输出一行,包含一个整数 k 和一个字符 ch,k 与 ch 之间用一个空格隔开。
其中 k 代表本局游戏一共掷骰子 k 次;ch 为获胜者,若小A获胜则 ch 为 'A',否则 ch 为 'B'。
题目保证 k 不超过 10000。
7 8201200334
0 3 1 -1 -3 0
10 1
0 0 2 0 3 0 -1 -5 0
HINT
当且仅当移动结束以后,即根据格子上的数字再次移动后,才能将对方棋子移回起点。
每次走棋,根据格子上数字来移动的操作只有一次,不会多次连锁移动。
玩家掷出6点而连续掷骰子时,也将轮流移动自己的两个棋子。