题意:
N个堆,每次可从一个堆中取走{a,b,c,……}个石子。
不能取者负。
从 1 to 10000 构造sg 函数即可
譬如 1 2 4可取
对任意 x 其sg 由 x-1 x-2 x-4 (如果非负)决定
而由于 是 从 1开始向上求的,就类似dp , 是记录的,无需递归计算……
一开始用递归,写了好久……写恶心了……</strong></span>
#include <iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<stack>
#define LL long long
using namespace std;
#define MAX 10000
int k,p,q;
int s[105];
int mex[MAX+5];
bool pd[105];
int Mex(int a)
{
memset(pd,0,sizeof(pd));
for(int i=0;i<k;i++)
{
int r=a-s[i];
if(r>=0)
pd[mex[r]]=1;
}
for(int i=0;;i++)
{
if(pd[i]==0)
{
return i;
}
}
}
int main()
{
while(scanf("%d",&k)&&k)
{
for(int i=0;i<k;i++)
scanf("%d",&s[i]);
for(int i=1;i<=MAX;i++)
mex[i]=Mex(i);
scanf("%d",&p);
while(p--)
{
scanf("%d",&q);
int n=0;
while(q--)
{
int m;
scanf("%d",&m);
n^=mex[m];
}
printf("%c",!n?'L':'W');
}
printf("\n");
}
return 0;
}