Let's Play Nim

Let's Play Nim

观察得知,第二个操作是 Nim

显然,先手希望异或和不为 00,后手反之。

由于 xyxyx\oplus y \ge x-y,只要甲使得某一个碗上硬币数大于总数一半即可获胜。

考虑 nn 为偶数的情况。

如果全部数出现偶数次,先手必败,后手每次跟先手选同一个数即可。

否则先手选当前最多的包,放到同一个盘子里,先手必胜。

再考虑 nn 为奇数的情况。

第二个玩家操作时选择当前最大的包,放到第一个玩家第一次放的盘子里,第二个玩家必胜。

#include<bits/stdc++.h>

using namespace std;

//#define int long long
typedef long long ll;
#define ha putchar(' ')
#define he putchar('\n')

inline int read()
{
	int x = 0, f = 1;
	char c = getchar();
	while (c < '0' || c > '9')
	{
		if (c == '-')
			f = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9')
		x = x * 10 + c - '0', c = getchar();
	return x * f;
}

inline void write(int x)
{
	if(x < 0)
	{
		putchar('-');
		x = -x;
	}
	if(x > 9)
		write(x / 10);
	putchar(x % 10 + '0');
}

int n, a[1000010];

unordered_map<int, int> mp;

signed main()
{
	int T = read();
	while(T--)
	{
		if(!mp.empty()) mp.clear();
		n = read();
		for(int i = 1; i <= n; ++i) a[i] = read();
		if(n & 1) printf("Second\n");
		else
		{
			for(int i = 1; i <= n; ++i) mp[a[i]]++;
			bool fg = true;
			for (int i = 1; i <= n; i++)
				fg &= !(mp[a[i]] & 1);
			if (fg)
				printf("Second\n");
			else
				printf("First\n");
		}
	}
}
posted @ 2022-08-01 20:45  蒟蒻orz  阅读(2)  评论(0编辑  收藏  举报  来源