链接:https://ac.nowcoder.com/acm/contest/4743/D
小灰灰和小乔在玩取石子游戏,一堆石子有{n}n个石子,小灰灰和小乔轮流操作,小灰灰先手,每次操作的人可以进行以下操作:
假设当前石子数量为{k}k,如果{k>=2}k>=2,那么将石子分为{f(k)}f(k)和{k-f(k)}k−f(k)两堆,然后选择其中任意一堆石子取走。否则当前操作的人输。
其中{f(k)=x}f(k)=x,{x}x为满足满足{x*2<=k}x∗2<=k的最大整数。
小灰灰和小乔都非常聪明,所以都会采用最优的策略,你知道最后小灰灰和小乔谁能赢得游戏吗?
输入描述:
输入共包含{t}t组数据
第一行一个整数{t}t,表示测试用例的组数
接下来{t}t行每行一个整数{n}n。
输出描述:
对于每组案例,如果小灰灰赢,输出{“XiaoHuiHui”}“XiaoHuiHui”,否则输出{“XiaoQiao”}“XiaoQiao”,不带双引号。
示例1
输入
复制
10 1 2 3 4 5 6 7 8 9 10
输出
复制
XiaoQiao XiaoHuiHui XiaoHuiHui XiaoQiao XiaoQiao XiaoQiao XiaoHuiHui XiaoHuiHui XiaoHuiHui XiaoHuiHui
备注:
{1<=t<=100000}1<=t<=100000
{1<=n<=1e18}1<=n<=1e18
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,t,k,ans;
int main()
{
cin>>t;
while(t--)
{
cin>>n;
if(n<2)
cout<<"XiaoQiao"<<endl;
else
{
if(n<=3)
cout<<"XiaoHuiHui"<<endl;
else
{
int flag=1;
k=3;
while(k<n)
{
if(flag==1)
{
k*=2;
flag=0;
}
else
{
k=k*2+1;
flag=1;
}
}
if(flag==1)
cout<<"XiaoHuiHui"<<endl;
else
cout<<"XiaoQiao"<<endl;
}
}
}
}