Alice and Bob

Alice 和 Bob 两人玩游戏 . 游戏规则如下 : 有 n 个球排成一行 , 其中第 m 个球是红色 , 其余球是白色 . Alice 和 Bob 轮流取球 , 每个人可以选择这一行球最左边的至多 k 个连续的球或者最右边的至多 k 个连续的球 ( 不能不取 ) , 然后将所选的球全部取走 . 先将红色球取走的玩家获得胜利 . 假设 Alice 先开始取球 , 在两个人都采取最优策略的情况下 , 谁会获得胜利 ?

Input

第一行为一个正整数 T\((1 ≤ T ≤ 500)\) , 表示样例的个数 . 接下来的 T 行 , 每行包含三个正整数 n , m 和 k\((1 ≤ n, m, k ≤ 10^5, 1 ≤ m ≤ n)\) .

Output

对于每个样例输出一行 , 若 Alice 获得胜利 , 则输出 "Alice" ( 不含引号 , 下同 ) , 否则输出 "Bob" .

思路

我们将先手必赢简称为必赢,先手必输简称为必输。
我们先考虑特殊情况,如果\(m\)的左端或者右端有小于\(k\)个球那么就是必赢的情况,如果恰有\(k\)个那么就是必输的情况。
然后我们来考虑一般的情况,假设左右两端有大于等于\(k+1\)个球,对于这类博弈问题,我们要考虑拿球的周期性问题。假设A拿x个球,B必然可以拿\(k-x+1\)个球,使得本轮所拿的总和为\(k+1\)个球。
我们先考虑球的个数远超于\(k+1\)的情况,这样拿是具有周期性的不影响操作数的,所以这样的拿法是不会影响最后结果的,到了某一端为\(k+x(1≤x≤k)\)另一端为\(k+y(1≤y≤k)\)的时候,这时候当x=y时无论怎么拿都是必输,而当x≠y时假设y>x那么先手可以拿y-x个转换先后手,则必赢。
所以我们只需要对左右两边模\(k+1\)余数相等则Bob赢,反之Alice赢。

#include <iostream>
using namespace std;

int main(){
	int t;
	cin >> t;
	while(t--){
		int n, m, k;
		cin >> n >> m >> k;
		int l = m - 1, r = n - m;
		if(l % (k + 1) == r % (k + 1) && l >= k && r >= k)
			cout << "Bob" << endl;
		else cout << "Alice" << endl;
	}
	return 0;
}