經典 Nim 遊戲變體:每次只能取 S 集合中指定數量的石子。給定多堆石子,判斷先手勝負。多組測試,每組多個詢問。
#include
#include
#include
using namespace std;
const int MAXH = 10005;
int S[105], sg[MAXH];
bool vis[MAXH];
void computeSG(int k) {
memset(sg, 0, sizeof(sg));
for (int i = 1; i < MAXH; i++) {
memset(vis, 0, sizeof(vis));
for (int j = 0; j < k; j++) {
if (i >= S[j]) vis[sg[i - S[j]]] = true;
}
for (int j = 0; ; j++) if (!vis[j]) { sg[i] = j; break; }
}
}
int main() {
int k;
while (~scanf("%d", &k) && k) {
for (int i = 0; i < k; i++) scanf("%d", &S[i]);
computeSG(k);
int m; scanf("%d", &m);
string ans;
while (m--) {
int l; scanf("%d", &l);
int xorsum = 0;
while (l--) { int h; scanf("%d", &h); xorsum ^= sg[h]; }
ans += (xorsum ? 'W' : 'L');
}
printf("%s\n", ans.c_str());
}
return 0;
}