https://codeforces.com/contest/1537/problem/D
博弈论:倒腾
- 1.n为非合数就会输
- 2.让n变为非合数的会赢
- 3.(需要想法)奇数好像可以变成非合数。奇数的因子是奇数,得到偶数
- 4.由于该奇数是m(奇)* n(奇)变为m * n-m=m(奇)(n-1)(偶)偶数,所以又可以减m变为奇数m(n-2),迟早会减为非合数的。
至此,奇数输,(奇)*(偶)赢
- 5.只剩下不能分解成(奇)*(偶)的了,必是2的幂次。
- 6.由于2输,2n要么减半要么减不到一半,如果不到一半,那又是非2n的(奇)*(偶)给对方赢。所以只能选减半还有希望。于是2^k是k为奇数则输,k为偶数则赢。
综上,输:奇数,2n且n为奇数。赢相反。
#include<iostream>
#ifdef LOCAL
FILE* FP = freopen("text.in", "r", stdin);
#endif
using namespace std;
int t, n, c;
signed main() {
scanf("%d", &t);while (t--) {
scanf("%d", &n);c = 0;while (!(n & 1)) {
n >>= 1;++c;}printf("%s\n", (!c || (n == 1 && (c & 1))) ? "Bob" : "Alice");}
}