题目大意
现有(n)个东西,每次可以取(1)个,(2)个或(k)个。Alice和Bob轮流取,且Alice先取。问谁是最后一个取的。((0 leq n leq 10^9),(3 leq k leq 10^9))
题解
首先,我们先考虑只有(1)和(2)的情况。容易想到(3|k)时,先手必败。
此时,我们再加上(k)。随手推几下就会发现,当(k mod 3
ot = 0)时,(k)也就相当于是(1)或(2),这样的话直接判断即可。
而当(3|k)时,实际上,当Alice取(1)或(k)时,Bob也能取(k)或(1),此时共取了(k + 1)个,而当Alice取(1)或(2)时,Bob也可以取(2)或(1),总共取了(3)个,对答案不影响。
所以,当(3|k)时,我们可以让(n)对(k + 1)取余,然后最多只能取一次(k),判断是否能取(k),或再进行无(k)判断即可。
#include <iostream>
using namespace std;
int T;
int n, k;
int main()
{
cin >> T;
while(T--)
{
cin >> n >> k;
if(k % 3)
{
if(n % 3) cout << "Alice
";
else cout << "Bob
";
continue;
}
n %= k + 1;
if(n == k) cout << "Alice
";
else if(n % 3) cout << "Alice
";
else cout << "Bob
";
}
return 0;
}