https://ac.nowcoder.com/acm/contest/4743/E
就是说每次能取走一半
我是这样想的 如果先手取掉一半后的赢的是后手,那么先手就一定赢
因为我取掉一半之后 先手后手位置转变了 先手取了这一部分 剩下那部分的赢家是原来的后手 此时先手变成了后手 自然是最开始的先手赢
然后写了几个找下规律
0 1 3 6 13 26 53 106
0-1是Q赢
2到3是H赢
4到6是Q赢
7到13是H赢
14到26是Q赢
27到53是H赢
54到106是Q赢
注意一下因为H先手所以他如果可以把Q变成必败方一定优先的
举个例子 比如就说27 分成两部分是13 14
因为H先手 那么27-13=14 27-14=13
如果H拿走13 剩余14 我们发现n=14时候是Q赢也就是后手赢
取走后 H和Q先后手关系转变 H从先手变成了后手 那么H就必赢
那么对于53 两部分是26 27
因为n=26是Q赢 也就是后手赢 那么H就取走27那一部分 H就变成了后手
所以n=53时候 H赢
计算间隔的差是 1 2 3 7 13 27 53
找下规律 发现对于偶数位置就是前一项的两倍加1
奇数位置就是前一项的两倍减1
然后写一下就好了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define me(a,x) memset(a,x,sizeof a)
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define all(x) (x).begin(), (x).end()
#define pb(a) push_back(a)
#define paii pair<int,int>
#define pali pair<ll,int>
#define pail pair<int,ll>
#define pall pair<ll,ll>
#define fi first
#define se second
int main()
{
int t;
cin>>t;
while(t--)
{
ll n,m;cin>>n;
if(n==1){puts("XiaoQiao");continue;}
ll sum=1,k=2;
int ans=0;
for(;sum<n;ans++){
if(ans&1) sum=sum+k,k=2*k+1;
else sum=sum+k,k=2*k-1;
//printf("%lld %lld\n",sum,k);
}
puts((!(ans&1))?"XiaoQiao":"XiaoHuiHui");
}
return 0;
}