硬币
时间限制: 1 Sec 内存限制: 128 MB
题目描述
现在有n堆硬币,第i堆硬币有xi个硬币。yoyo和灰灰轮流进行操作,每次操作只能选择一堆硬币,然后从这一堆硬币中取任意多个硬币(1~x,x为该堆最大数量),但不能不取。轮到的人如果没有硬币可取,则输。yoyo先手,谁能获胜?
输入
首行输入t,代表t组样例
每组样例第一行输入n,代表n堆硬币。n<=1000;
接下来n个数字(a1,a2,a3......an)代表每堆硬币的硬币数。an<=1000;
输出
输出谁赢。yoyo必胜输出yoyo,否则输出zhazhahui
样例输入
2 3 2 3 4 4 2 3 4 5
样例输出
yoyo zhazhahui
分析:
对于一堆硬币,假设有x个,则这堆硬币取一次后,剩余的个数可能是mex={0,1,2.....x-2,x-1},
SG表示最小的不属于mex集合的最小非负整数,即SG(x)=x;
所以ans=x1^x2^x3.......xn;若ans=0,说明先手必败,否则先手必胜
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int n,t;
cin>>t;
while(t--){
cin>>n;
int x,ans=0;
for(int i=0;i<n;i++){
cin>>x;
ans^=x;
}
if(ans==0)
printf("zhazhahui\n");
else
printf("yoyo\n");
}
return 0;
}