题目链接:http://poj.org/problem?id=2960
Language:
S-Nim
Description
Arthur and his sister Caroll have been playing a game called Nim for some time now. Nim is played as follows:
recently learned an easy way to always be able to find the best move:
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. Input
Input consists of a number of test cases.
For each test case: The first line contains a number k (0 < k ≤ 100) describing the size of S, followed by k numbers si (0 < si ≤ 10000) describing S. The second line contains a number m (0 < m ≤ 100) describing the number of positions to evaluate. The next m lines each contain a number l (0 < l ≤ 100) describing the number of heaps and l numbers hi (0 ≤ hi ≤ 10000) describing the number of beads in the heaps. The last test case is followed by a 0 on a line of its own. Output
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. Sample Input 2 2 5 3 2 5 12 3 2 4 7 4 2 3 7 12 5 1 2 3 4 5 3 2 5 12 3 2 4 7 4 2 3 7 12 0 Sample Output LWW WWL Source |
SG函数详解:http://www.cnitblog.com/weiweibbs/articles/42735.html
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int Scan()
{
int res=0,ch,flag=0;
if((ch=getchar())=='-')flag=1;
else if(ch>='0'&&ch<='9')res=ch-'0';
while((ch=getchar())>='0'&&ch<='9')res=res*10+ch-'0';
return flag?-res:res;
}
void Out(int a)
{
if(a>9)Out(a/10);
putchar(a%10+'0');
}
#define INF 0x3f3f3f3f
#define bug cout<<"bug"<<endl
const int MAXN = 1e4+7;
int a[MAXN],poi[MAXN];
int sg[MAXN];
int n,m,k,ans,p;
bool vis[MAXN];
void get_sg()
{
for(int i=0; i<MAXN; ++i)
{
memset(vis,0,sizeof(vis));
for(int j=0; j<n && poi[j]<=i; ++j)
vis[ sg[i-poi[j]] ]=1;
for(int j=0; ;++j)if(!vis[j])
{sg[i]=j;break;}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(!n)break;
for(int i=0; i<n; ++i)
poi[i]=Scan();
sort(poi,poi+n);
get_sg();
m=Scan();
for(int i=0; i<m; ++i)
{
k=Scan(),ans=0;
for(int j=0; j<k; ++j)
{
p=Scan();
ans^=sg[p];
}
if(ans)putchar('W');
else putchar('L');
}
putchar('\n');
}
return 0;
}