题目大意
现有\(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 \bmod 3 \not = 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\n";
else cout << "Bob\n";
continue;
}
n %= k + 1;
if(n == k) cout << "Alice\n";
else if(n % 3) cout << "Alice\n";
else cout << "Bob\n";
}
return 0;
}