Arthur and his sister Caroll have been playing a game called Nim for some time now. Nim is played as follows:
- The starting position has a number of heaps, all containing some, not necessarily equal, number of beads.
- The players take turns chosing a heap and removing a positive number of beads from it.
- The first player not able to make a move, loses.
Arthur and Caroll really enjoyed playing this simple game until they
recently learned an easy way to always be able to find the best move:
- Xor
the number of beads in the heaps in the current position (i.e. if we
have 2, 4 and 7 the xor-sum will be 1 as 2 xor 4 xor 7 = 1).
- If the xor-sum is 0, too bad, you will lose.
- Otherwise, move such that the xor-sum becomes 0. This is always possible.
It is quite easy to convince oneself that this works. Consider these facts:
- The player that takes the last bead wins.
- After the winning player‘s last move the xor-sum will be 0.
- The xor-sum will change after every move.
Which
means that if you make sure that the xor-sum always is 0 when you have
made your move, your opponent will never be able to win, and, thus, you
will win.
Understandibly it is no fun to play a game when both players know
how to play perfectly (ignorance is bliss). Fourtunately, Arthur and
Caroll soon came up with a similar game, S-Nim, that seemed to solve
this problem. Each player is now only allowed to remove a number of
beads in some predefined set S, e.g. if we have S = {2, 5} each player
is only allowed to remove 2 or 5 beads. Now it is not always possible to
make the xor-sum 0 and, thus, the strategy above is useless. Or is it?
your job is to write a program that determines if a position of
S-Nim is a losing or a winning position. A position is a winning
position if there is at least one move to a losing position. A position
is a losing position if there are no moves to a losing position. This
means, as expected, that a position with no legal moves is a losing
position.
For
each position: If the described position is a winning position print a
‘W‘.If the described position is a losing position print an ‘L‘.
Print a newline after each test case.
1 #include<cstdio>
2 #include<cstring>
3 #define FOR(a,b,c) for(int a=(b);a<(c);a++)
4 using namespace std;
5
6 int n,m,a[101],sg[10001];
7
8 int dfs(int x) {
9 if(sg[x]!=-1) return sg[x];
10 if(!x) return sg[x]=0;
11 int vis[10001]; //size of [si]
12 memset(vis,0,sizeof(vis));
13 FOR(i,0,n)
14 if(x>=a[i]) vis[dfs(x-a[i])]=1;
15 for(int i=0;;i++)
16 if(!vis[i]) return sg[x]=i;
17 }
18
19 int main() {
20 while(scanf("%d",&n)==1 && n) {
21 FOR(i,0,n) scanf("%d",&a[i]);
22 scanf("%d",&m);
23 memset(sg,-1,sizeof(sg));
24 FOR(i,0,m) {
25 int x,v,ans=0;
26 scanf("%d",&x);
27 FOR(j,0,x)
28 scanf("%d",&v) , ans^=dfs(v);
29 if(ans) printf("W");
30 else printf("L");
31 }
32 putchar(‘\n‘);
33 }
34 return 0;
35 }