第一道用sg函数的题目 存模板
mex求最小非负整数mex{} = 0,mex{0,1,2,4} = 3,mex{1,2,4} = 0
sg[x] =mex{sg[y]|y是x的后继}
1. sg[x] == 0时,它的后继都不为零 对应P态
2. sg[x] != 0时,它的后继一定有为零的 对应N态
#include <bits/stdc++.h>
using namespace std;
int sg[10010],grab[110];
bool book[10010];
int n;
void calculate()
{
int i,j;
memset(sg,0,sizeof(sg));
for(i=1;i<=10000;i++)
{
memset(book,0,sizeof(book));
for(j=1;j<=n;j++)
{
if(i-grab[j]>=0)
{
book[sg[i-grab[j]]]=1;
}
}
for(j=0;j<=10000;j++)
{
if(book[j]==0)
{
sg[i]=j;
break;
}
}
}
return;
}
int main()
{
int i,q,m,t,sum;
char ch[110];
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(i=1;i<=n;i++)
{
scanf("%d",&grab[i]);
}
calculate();
scanf("%d",&q);
for(i=0;i<q;i++)
{
scanf("%d",&m);
sum=0;
while(m--)
{
scanf("%d",&t);
sum^=sg[t];
}
if(sum==0) ch[i]='L';
else ch[i]='W';
}
ch[i]='\0';
printf("%s\n",ch);
}
return 0;
}