#include<bits/stdc++.h>
using namespace std;
const int N=110;
int f[N];
int 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));
}
}
for(int i=0;;i++)
{
if(!S.count(i))
{
return f[x]=i;
}
}
}
int main()
{
memset(f,-1,sizeof f);
cin>>n;
int res=0;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
res^=sg(x);
}
if(res) puts("Yes");
else puts("No");
return 0;
}
代码非常简单,主要是怎么转换
一堆石子变成两堆石子,因为一堆石子的石子个数在减小,所以是可以结束的游戏
转换成有向图,sg(b1,b2)=sg(b1)^sg(b2)
有点难以理解