思路
这题其实就相当于这道红题的强化版。
- 首先不考虑 ,很容易想到当
时 `Bob` 赢(你取
我就取
,你取
我就取
),否则 `Alice` 赢(先把余数取了,你取
我就取
,你取
我就取
)。
- 接着考虑 的情况。很明显,当
时取
就相当于取
,当
时取
就相当于取
。所以,此时有无
影响不大,按照上一种方法输出即可。
- 当 时,我们可以通过列举找规律。
当 | |||||||||
赢家 | `Bob` | `Alice` | `Alice` | `Alice` | `Bob` | `Alice` | `Alice` | `Alice` | `Bob` |
显而易见, 次形成一个循环。我们将
,
如果 (直接取走)或者
,输出 `Alice`,否则输出 `Bob`。
代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
// 快读
inline int read() {
int x = 0,f = 1;char ch = getchar();
while (ch < '0' or ch > '9'){if (ch == '-') f = -1;ch = getchar();}
while (ch >= '0' and ch <='9'){x = x * 10 + ch - 48;ch = getchar();}
return x * f;
}
//快写
inline void write(int x) {
if(x < 0) putchar('-'),x = -x;
if(x > 9) write(x / 10);
putchar(x % 10 + '0');
return;
}
//输出char
void writec(char x) {
putchar(x);
return;
}
int main() {
int t = read();
while(t--) {
int n = read(),k = read();
if(k % 3 != 0) {
if(n % 3 != 0) printf("Alice\n");
else printf("Bob\n");
}
else {
n %= (k + 1);
if(n == k||n % 3) printf("Alice\n");
else printf("Bob\n");
}
}
return 0;
}
Update
2023/01/09 提交审核