从样例中可以看出1是必败态,它无法分成两份
2是必胜态
按博弈论讨论必胜态就是自己操作后是对方陷入必败态
从样例上看
可以转移到1的必胜态1*2,1*2+1 {1+(1+1)}即【2,3】必胜态
只能转移到上必胜态的必败态 2*2,2+3,2*3,即【4,6】必败态
可以转移到上必败态的必胜态4*2-1,4*2,。。。,2*6+1,级【7,13】必胜态
由此我们可以看出
如果上个必胜是【wl,wr】,则该必败是【2*wl,2*wr】
如果上个必败是【fl,fr】,则该必胜是【2*fl-1(fl!=1),2*fr+1】
由于左区间必败要特判不方便,所以用右区间判断
我们可以看出右区间是
必胜:必败*2+1
必败:必胜*2
。。
这样更替的
所以我们可以求出恰好包含n的右区间就可以了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t,n;
bool work(ll x){
ll tmp=1,flag=0;//1(必败)对应0
while(tmp<x){
flag^=1;
tmp=(tmp<<1)+flag;
}
return flag;
}
int main(){
cin>>t;
for(int i=0;i<t;i++){
cin>>n;
if(work(n)){
cout<<"XiaoHuiHui"<<endl;
}else cout<<"XiaoQiao"<<endl;
}
return 0;
} 计算时间复杂度:1e5*log2(1e8)=1e5*20——没问题(创作不易点赞再走

京公网安备 11010502036488号