取硬币游戏 SG函数

硬币

时间限制: 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;
 }

猜你喜欢

转载自blog.csdn.net/qq_40507857/article/details/81279228