S-Nim
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 3694   Accepted: 1936

Description

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.

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函数。

裸ti ,注意下sg和vis的大小就好了 :)

【代码】

 #include<cstdio>
#include<cstring>
#define FOR(a,b,c) for(int a=(b);a<(c);a++)
using namespace std; int n,m,a[],sg[]; int dfs(int x) {
if(sg[x]!=-) return sg[x];
if(!x) return sg[x]=;
int vis[]; //size of [si]
memset(vis,,sizeof(vis));
FOR(i,,n)
if(x>=a[i]) vis[dfs(x-a[i])]=;
for(int i=;;i++)
if(!vis[i]) return sg[x]=i;
} int main() {
while(scanf("%d",&n)== && n) {
FOR(i,,n) scanf("%d",&a[i]);
scanf("%d",&m);
memset(sg,-,sizeof(sg));
FOR(i,,m) {
int x,v,ans=;
scanf("%d",&x);
FOR(j,,x)
scanf("%d",&v) , ans^=dfs(v);
if(ans) printf("W");
else printf("L");
}
putchar('\n');
}
return ;
}

poj 2960 S-Nim(SG函数)的更多相关文章

  1. POJ 2960 S-Nim 博弈论 sg函数

    http://poj.org/problem?id=2960 sg函数几乎是模板题. 调试代码的最大障碍仍然是手残在循环里打错变量名,是时候换个hydra产的机械臂了[超想要.jpg] #includ ...

  2. HDU3544 Alice's Game && POJ 2960 S-Nim(SG函数)

    题意: 有一块xi*Yi的矩形巧克力,Alice只允许垂直分割巧克力,Bob只允许水平分割巧克力.具体来说,对于Alice,一块巧克力X i * Y i,只能分解成a * Y i和b * Y i其中a ...

  3. poj 2960 S-Nim【SG函数】

    预处理出SG函数,然后像普通nim一样做即可 #include<iostream> #include<cstdio> using namespace std; const in ...

  4. hdu 3032 Nim or not Nim? sg函数 难度:0

    Nim or not Nim? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  5. 多校6 1003 HDU5795 A Simple Nim (sg函数)

    思路:直接打表找sg函数的值,找规律,没有什么技巧 还想了很久的,把数当二进制看,再类讨二进制中1的个数是必胜或者必败状态.... 打表: // #pragma comment(linker, &qu ...

  6. S-Nim POJ - 2960 Nim + SG函数

    Code: #include<cstdio> #include<algorithm> #include<string> #include<cstring> ...

  7. HDU 3032 Nim or not Nim (sg函数)

    加强版的NIM游戏,多了一个操作,可以将一堆石子分成两堆非空的. 数据范围太大,打出sg表后找规律. # include <cstdio> # include <cstring> ...

  8. hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)

    Nim or not Nim? Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Sub ...

  9. HDU 1729 Stone Game 石头游戏 (Nim, sg函数)

    题意: 有n个盒子,每个盒子可以放一定量的石头,盒子中可能已经有了部分石头.假设石头无限,每次可以往任意一个盒子中放石头,可以加的数量不得超过该盒中已有石头数量的平方k^2,即至少放1个,至多放k^2 ...

随机推荐

  1. [弹出消息] C#ShowMessageBox帮助类

    点击下载 ShowMessage.rar 看下面代码吧 /// <summary> /// 类说明:Assistant /// 编 码 人:苏飞 /// 联系方式:361983679 // ...

  2. 从source folder 下将其所有子文件夹的*.* 文件拷贝到 target folder (不拷贝文件夹名仅拷贝文件)

    因本人较懒,一直认为电脑能做的就让电脑来做,所以写下这个批处理的小脚本方便工作. 场景:碰到要拷贝一个文件夹(source folder)下的多个子文件夹(sub-folder)的文件到指定文件夹下( ...

  3. 如何:确定调用 ASP.NET 网页的方式

    如何:确定调用 ASP.NET 网页的方式 通常有必要了解调用 ASP.NET 网页的方式:是由原始请求 (HTTP GET).回发 (HTTP POST).来自其他页的跨页面发送 (HTTP POS ...

  4. java输入输出流(内容练习)

    1,编写一个程序,读取文件test.txt的内容并在控制台输出.如果源文件不存在,则显示相应的错误信息. package src; import java.io.File; import java.i ...

  5. 选择排序(C++)

    选择排序(C++) 选择排序: 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待 ...

  6. 读书笔记之 - javascript 设计模式 - 观察者模式

    在事件驱动的环境中,比如浏览器这种持续寻求用户关注的环境中,观察者模式是一种管理人与其任务(确切的讲,是对象及其行为和状态之间的关系)之间的关系的得力工具.用javascript的话来讲,这种模式的实 ...

  7. PowerDesigner 的几个使用技巧

    1.  生成sql脚本 Database→Generate Database 选择要输出的文件路径,即文件存储路径,并根据需要修改文件名,单击确定后便会生成sql脚本.   在Options选项卡里, ...

  8. 原始的JDBC操作

    -----------------------------根据配置文件---------------------------- package cn.gdpe.jdbc; import java.io ...

  9. 修正constructor的指向

    function Aaa(){ } //Aaa.prototype.constructor = Aaa;   //每一个函数都会有的,都是自动生成的 Aaa.prototype.name = '小明' ...

  10. HDU 5491 The Next

    Problem Description Let L denote the number of 1s in integer D’s binary representation. Given two in ...