N堆石子,每次可以从选择一堆取走若干个,每次取的数量必须在给定的集合中,取走最后一个的胜利,现在给出操作集合,然后给出N组数据,每组数据有M堆石头,并给出每堆的数量问先手胜负。SG函数网上好多资料就不赘述了,对每一堆求出SG函数值,判断一下异或起来的结果是否为0就ok了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
int s[200];
int f[20000];
int n,m,k;
int mex(int p)
{
bool g[200];
int t;
memset(g,0,sizeof g);
for (int i=1; i<=k; i++)
{
t=p-s[i];
if (t<0) break;
if (f[t]==-1) f[t]=mex(t);
g[f[t]]=true;
}
for (int i=0; ; i++)
if (!g[i])
{
return i;
}
}
int main()
{
// freopen("in.txt","r",stdin);
while(~scanf("%d",&k) && k)
{
for (int i=1; i<=k; i++)
{
scanf("%d",&s[i]);
}
sort(s+1,s+1+k);
int ans=0;
scanf("%d",&n);
int x;
memset(f,-1,sizeof f);
f[0]=0;
for (int i=1; i<=n; i++)
{
scanf("%d",&m);
ans=0;
for (int j=1; j<=m; j++)
{
scanf("%d",&x);
if (f[x]==-1) f[x]=mex(x);
ans^=f[x];
}
if (ans==0)
{
cout<<"L";
}
else
{
cout<<"W";
}
}
cout<<endl;
}
return 0;
}