莫欺少年穷,修仙之旅在这开始—>算法基础课题解
可参考: 集合-Nim游戏
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int n;
int f[N];
int sg(int x)
{
if(f[x]!=-1) return f[x];
unordered_set<int> S;
//枚举所有可能的局面,两堆的异或和就是当前局面的值
for(int i=0;i<x;i++)
for(int j=0;j<=i;j++)
S.insert(sg(i)^sg(j));
// mex操作
for(int i=0;;i++)
if(!S.count(i))
return f[x]=i;
}
int main()
{
cin>>n;
memset(f,-1,sizeof f);
int res=0;
while(n--)
{
int x;
cin>>x;
res^=sg(x);
}
if(res) puts("Yes");
else puts("No");
return 0;
}