D. Deleting Divisors
先上题解:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
while(n--){
int x;
cin>>x;
if(x%2==1){cout<<"Bob"<<endl;continue;}
int res=0;
while(x%2==0){
res++;
x/=2;
}
if(x>1){
cout<<"Alice"<<endl;
}
else{
if(res%2==0){
cout<<"Alice"<<endl;
}
else cout<<"Bob"<<endl;
}
}
return 0;
}
1.首先分析为什么a先手奇数一定判负:
1.1:如果这个奇数本身是一个质数那么a一定输。
1.2:如果这个奇数是一个合数那么他的因子一定是奇数且可以表达为 x1=奇x奇,那么如果a要减去一个数,这个数一定是奇数,则 x2=(奇-1)x奇 就变成了一个含奇数的偶合数,将含奇数的偶合数的局面留给了b,而一旦谁获得了含奇数的偶合数局面一定赢 分析:b可以选择x3=((奇-1)-1)x奇,也就是在上一个偶x奇的状态下又变成了奇x奇的状态,留给a的永远是奇数的状态,而a一直是奇数只能不断给b含奇数的偶合数状态,最终辗转a只能变成1x奇数,而这个奇数是最开始的奇因子,是质数,所以a必输。
2.如果这个数能被2的倍数整除,局面会是什么?
2.1:这个数是2的奇次方那么b一定赢,为什么?因为一开始a先手可以有两种选择:第一种,减去2的奇次方-2及前面的任意一种 例如:2^101 那么可以减去2^99及前面任意一种2的次方,会把局势变成含奇数x偶合数,和上面分析一样b掌握奇数x偶合数的局面必胜。第二种选择: 2^101-2^100 变成2^100的局面给b,那么b一样可以通过 2^100-2^99 变成2^99还是2的奇次方丢给a,辗转下来a变成2^1=2必输。
2.2:这个数是2的偶次方,那就是上述2.1b接手a的情况,a必胜。