题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1536
题意:有若干堆石子,每次可以从任意一堆石子中取若干颗(数目必须在集合S中),问谁会获胜。
思路:SG函数的应用,具体可看http://blog.csdn.net/zhoufenqin/article/details/7903741
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 100 + 10;
const int maxv = 10000 + 10;
int S[maxn], sg[maxv], vis[maxv], a[maxn];
int ns, cnt;
void init() {
memset(sg, 0, sizeof sg);
for(int i = 1; i < maxv; i++) {
++cnt;
for(int j = 0; j < ns; j++) if(i - S[j] >= 0)
vis[sg[i - S[j]]] = cnt;
for(int j = 0; ; j++) if(vis[j] != cnt) {
sg[i] = j;
break;
}
}
}
int main() {
while(scanf("%d", &ns) && ns) {
for(int i = 0; i < ns; i++) scanf("%d", &S[i]);
init();
int T;
scanf("%d", &T);
while(T--) {
int n;
scanf("%d", &n);
int sum = 0;
for(int i = 0; i < n; i++) {
scanf("%d", a+i);
sum ^= sg[a[i]];
}
if(sum) printf("W");
else printf("L");
}
printf("\n");
}
return 0;
}