题目描述
题解
首先先手从中选出一个极长的子序列使它们的异或和=0,这就相当于是建立一个一个先手必败的Nim游戏。
然后后手如果再取出一个子序列就相当于是建立一个先手必胜的Nim游戏,这时候先手只需要将其变成必败的,让后手一直面对这一堆必败的Nim游戏就可以了。
如果先手不能选出一个子序列使它们的异或和=0,那么他建立的Nim游戏就是先手必胜的。即使后手也必须建立先手必胜的Nim游戏,但是由于先手面对的先手必胜的游戏一定为偶数个,而后手为奇数个,所以后手必胜。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 20
int T,n,cnt,a[N],b[N];
bool flag;
bool check()
{
if (!cnt) return false;
int ans=0;
for (int i=1;i<=n;++i)
if (b[i]) ans^=a[i];
if (!ans) return true;
else return false;
}
void dfs(int dep)
{
if (flag) return;
if (dep==n+1)
{
if (check()) flag=true;
return;
}
for (int i=0;i<=1;++i)
{
b[dep]=i;
if (i) ++cnt;
dfs(dep+1);
if (i) --cnt;
if (flag) return;
}
}
int main()
{
T=10;
while (T--)
{
scanf("%d",&n);
for (int i=1;i<=n;++i) scanf("%d",&a[i]);
flag=false;
dfs(1);
if (flag) puts("NO");
else puts("YES");
}
}