[hdu 1536 S-Nim] SG 函数
题目链接:[hdu 1536 S-Nim]
题意描述:给定
K
个数
解题思路:裸的SG函数的题目。由
s1,s2,…,sk
可以求出sg函数。然后跟
nim
一样求一个异或和就OK了。
#include <set>
#include <queue>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w",stdout)
#define fst first
#define snd second
#define rep(i, s, t) for(int i = (s); i <= (t); i++)
//typedef __int64 LL;
//typedef long long LL;
typedef pair<int, int> PII;
const int MAXN = 100 + 5;
const int MX = 10000 + 5;
int K, M, L;
int s[MAXN], h[MAXN];
int sg[MX];
bool Hash[MX];
void getSG(int SZ) {
memset(sg, 0, sizeof(sg));
rep(i, 1, SZ) {
memset(Hash, false, sizeof(Hash));
rep(j, 1, K) {
if(i - s[j] < 0) break;
Hash[sg[i - s[j]]] = true;
}
rep(j, 0, SZ) {
if(Hash[j] == false) {
sg[i] = j;
break;
}
}
}
}
int main() {
#ifndef ONLINE_JUDGE
FIN;
#endif // ONLINE_JUDGE
int xsum;
while(~scanf("%d", &K) && K) {
rep(i, 1, K) {
scanf("%d", &s[i]);
}
sort(s + 1, s + K + 1);
K = unique(s + 1, s + K + 1) - (s + 1);
getSG(MX);
scanf("%d", &M);
rep(i, 1, M) {
scanf("%d", &L);
xsum = 0;
rep(j, 1, L) {
scanf("%d", &h[j]);
xsum ^= sg[h[j]];
}
putchar(xsum ? 'W' : 'L');
}
putchar('\n');
}
return 0;
}