Nim-sum
//s-nim
//所有游戏的nim和=每个游戏的SG函数值异或
//对于一个局面,当且仅当A1 xor A2 xor … xor AN =0时,该局面为P局面(必败)
//当nim和为0,ai xor nim-sum也不改变ai的值
//当nim和不为零,找到其最高位(必为1),找到ai对应位为1,将ai变成ai xor nim-sum,nim和最高位变成0
//按此方法可以让nim和变成0 找到必败点
#include<cstdio>
#include<algorithm>
using namespace std;
int k,m,n;
int s[101],a[101],sg[10001];
int xxor;
int main(){
while(scanf("%d",&k)==1&&k){
for(int i=1;i<=k;i++) scanf("%d",&s[i]); //每次可以取的数目
sort(s+1,s+k+1);
sg[0]=0;
for(int i=1;i<=10000;i++){ //模拟mex函数
bool mex[10001]={0};
for(int j=1;j<=k;j++){
if(i>=s[j]) mex[sg[i-s[j]]]=1;
//mex函数意义:找到相同局面(一个是另一个的子局面||sg值相同)的点
//子局面由母局面经历一步操作而来
else break;
}
for(int k=0;k<=10000;k++){
if(mex[k]==0){
sg[i]=k;
break;
}
}
}
scanf("%d",&m);
while(m--){
xxor=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
xxor^=sg[a[i]]; //把ai变成ai xor nim-sum
}
if(xxor) printf("W");
else printf("L");
}
puts("");
}
return 0;
}

浙公网安备 33010602011771号