$\huge \color{orange}{成仙之路->}$ $\huge \color{purple}{算法基础课题解}$
$ mex\ 函数:mex(S)=\min\{ x\},(x\notin S,x\in N)\ (不属于集合S的最小自然数)$
$ SG\ 函数:SG(x)=mex\{SG(y_1),SG(y_2),…,SG(y_k)\},(\ y_i\ 为\ x\ 的后继状态(1\leqslant i\leqslant k))$
$ n \ 个有向图,起点分别为\ s_1,s_2,…s_n,则SG(s_1)\bigoplus SG(s_2)\bigoplus…\bigoplus SG(s_n)=0\ 时先手必败,否则必胜$
证明可参考: Nim游戏
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 110, M = 10010;
int n,m;
int s[N],f[M];
int sg(int x)
{
if(f[x]!=-1) return f[x];
//定义一个集合,表示能到达的点的数,便于后面为当前点找集合中未出现的最小自然数
unordered_set<int> S;
for(int i=0;i<n;i++)
if(x>=s[i])
S.insert(sg(x-s[i]));
//返回集合中未出现过的最小自然数
for(int i=0;;i++)
if(!S.count(i))
return f[x]=i;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>s[i];
memset(f,-1,sizeof f);
int res=0;
cin>>m;
while(m--)
{
int x;
cin>>x;
res^=sg(x);
}
if(res) puts("Yes");
else puts("No");
return 0;
}