S-nim
Time limit:5000/1000 MS (java/others) Memory limit:65536/32768 K (java/others)
Problem Descriptionarthur and his sister Caroll has been playing a game called Nim for some time now. Nim is played as follows:
The starting position have 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 isn't able to make a move, loses.
Arthur and Caroll really enjoyed playing this simple game until they recently learned a easy-to-always be-able to fin D 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 would be 1 as 2 XOR 4 XOR 7 = 1).
If The xor-sum is 0, too bad, you'll lose.
Otherwise, move such that the xor-sum becomes 0. This was always possible.
It's quite easy-to-convince oneself that's this works. Consider these facts:
The player is takes the last bead wins.
After the winning player's last move the xor-sum would be 0.
The xor-sum would change after every move.
Which means that if you do sure that the xor-sum always was 0 when you had made your move, your opponent would never be a Ble to win, and, thus, you'll win.
Understandibly It is no 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, which seemed to solve this problem. Each player was now only allowed to remove a number of beads in some predefined set S, e.g. if we had S = (2, 5) each Playe Allowed to remove 2 or 5 beads. Now it isn't 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 this determines if a position of S-nim is a losing or a winning position. A position is a winning position if there are at least one move to a losing position. A position is a losing position if there be no moves to a losing position. This means, as expected, which a position with no legal moves is a losing position.
Inputinput consists of a number of test cases.
For each test case:the rst line contains a number k (0 < K <=) describing the size of S, followed by K numbers Si (0 < si <= 10000) describing S. The second line contains a number m (0 < M <=) describing the number of positions to evaluate. The next m lines each contain a number L (0 < L <=) describing the number of heaps and L numbers hi (0 <= hi <= 10000) describing the number of beads in the heaps.
The last test case was followed by a 0 on a line of its own.
Outputfor each position:
If the described position is a winning position print a ' W '.
If the described position is a losing position print a ' L '.
Print a newline after all test case.
Sample Input2 2 532 5 123 2 4 74 2 3 7 125 1 2 3 4 532 5 123 2 4 74 2 3 7 120
Sample OUTPUTLWWWWL
AC Code:
1#include <iostream>2#include <math.h>3#include <algorithm>4#include <string>5 using namespacestd;6 inta[ the];7 intsg[10005];8 intK;9 intMexintx)Ten { One if(sg[x]!=-1)returnSg[x]; A BOOLvis[ the]; -memset (Vis,0,sizeof(Vis)); - for(intI=0; i<k;i++) the { - if(x-a[i]>=0) - { -Mex (X-a[i]); +vis[sg[x-a[i]]]=true; - } + } A for(intI=0;i< the; i++) at if(!Vis[i]) - returnsg[x]=i; - } - intMain () - { - while(cin>>k&&k) in { - stringStr=""; tomemset (sg,-1,sizeof(SG)); +sg[0]=0; - for(intI=0; i<k;i++) theCin>>A[i]; *Sort (a,a+k); $ intm;Panax NotoginsengCin>>m; - for(;m>0; m--) the { + intcn1=0; A intX,u; theCin>>x; + for(intI=0; i<x;i++) - { $Cin>>u; $ans^=Mex (U); - } - if(!ans) str+="L"; the Elsestr+="W"; - } Wuyicout<<str<<Endl; the } - return 0; Wu}
Problem Solving report HDU1944 S-nim