看刘汝佳《算法竞赛入门经典训练指南》2.4
只看了点皮毛……
hdu1536
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 10005
#define M 105
using namespace std;
int sg[N],can[M];
int n,m,k;
bool vis[N];
int dfs_sg(int x){
if(vis[x]) return sg[x];
vis[x]=1;
bool mex[105]={0};
for(int i=1;i<=n;i++)
if(x>=can[i]) mex[dfs_sg(x-can[i])]=1;
for(int i=0;;i++) if(!mex[i]) {sg[x]=i;return sg[x];}
}
int main(){
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
while(scanf("%d",&n)){
if(n==0) break;
for(int i=1;i<=n;i++) scanf("%d",&can[i]);
scanf("%d",&m);
memset(sg,0,sizeof(sg));
memset(vis,0,sizeof(vis));
for(int i=1;i<=m;i++){
scanf("%d",&k);
int ans=0,x;
for(int j=1;j<=k;j++)
scanf("%d",&x),ans^=dfs_sg(x);
//printf("\n**%d %d\n",5,sg[5]);
if(ans==0) printf("L");
else printf("W");
}
printf("\n");
}
return 0;
}