都知道求sg函数有这几种方法:
1。打表找规律
2。 dfs
3。……(不知道还有什么了)
这道题因为有多组数据所以找不了规律,只能dfs。
dfs的方法和[poj2425]poj2425差不多。
//通过dfs来求sg函数
#include<cstdio>
#include<cstring>
using namespace std;
const int K=105,N=105;
int s[K],k,sg[10000+5];
void init()
{
memset(sg,-1,sizeof(sg));
}
int dfs(int x,int h)
{
bool vis[N];
memset(vis,0,sizeof(vis));
if(sg[x]!=-1) return sg[x];
for(int i=1;i<=k;i++)
if(x-s[i]>=0)
vis[dfs(x-s[i],h)]=1;
for(int i=0;i<=h;i++)
if(!vis[i]) return sg[x]=i;
}
int main()
{
while(scanf("%d",&k)&&k){
init();
sg[0]=0;
for(int i=1;i<=k;i++) scanf("%d",&s[i]);
int m;
scanf("%d",&m);
for(int i=1;i<=m;i++){
int n,h;
scanf("%d",&n);
int XOR=0;
for(int j=1;j<=n;j++){
scanf("%d",&h);
XOR^=dfs(h,h);
}
if(!XOR) printf("L");
else printf("W");
}
printf("\n");
}
}