HDU 1851 (巴什博奕 SG定理) A Simple Game

这是由n个巴什博奕的游戏合成的组合游戏。

对于一个有m个石子,每次至多取l个的巴什博奕,这个状态的SG函数值为m % (l + 1)。

然后根据SG定理,合成游戏的SG函数就是各个子游戏SG函数值的异或和。

 1 #include <cstdio>
 2
 3 int main()
 4 {
 5     int T, n; scanf("%d", &T);
 6     while(T--)
 7     {
 8         scanf("%d", &n);
 9         int s = 0, m, l;
10         while(n--) { scanf("%d%d", &m, &l); s ^= m%(l+1); }
11         printf("%s\n", s ? "No" : "Yes");
12     }
13
14     return 0;
15 }

代码君

时间: 2024-10-10 21:30:17

HDU 1851 (巴什博奕 SG定理) A Simple Game的相关文章

hdu 2897 巴什博奕变形

http://acm.hdu.edu.cn/showproblem.php?pid=2897 1.看清最后取的是输还是赢 2.分类讨论,想的时候,看怎么能回到最初状态---就是回到t*(p+q)+s的状态,以及怎么回到已经推出的必败态 #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <iostream> #include &l

hdu 1846 巴什博奕

http://acm.hdu.edu.cn/showproblem.php?pid=1846 以下摘自NEU培训课件 ?只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜. ?      cout<< n%(m+1)==0 ? "B" :"A"; ?显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜.因此我们发现了如何取胜的法则:如果 ?n=(m

HDU 2149 (巴什博奕) Public Sale

没什么好说的,一道水题. 1 #include <cstdio> 2 3 int main() 4 { 5 int n, m; 6 while(scanf("%d%d", &n, &m) == 2) 7 { 8 if(n <= m) 9 { 10 for(int i = n; i < m; i++) printf("%d ", i); 11 printf("%d\n", m); 12 continue; 1

hdu 2188 悼念512汶川大地震遇难同胞——选拔志愿者 (博弈论,巴什博奕)

悼念512汶川大地震遇难同胞——选拔志愿者 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6982    Accepted Submission(s): 4421 Problem Description 对于四川同胞遭受的灾难,全国人民纷纷伸出援助之手,几乎每个省市都派出了大量的救援人员,这其中包括抢险救灾的武警部队,治疗和防疫的医护人

hdu1847 Good Luck in CET-4 Everybody! ,巴什博奕,理解SG函数

hdu1847 Good Luck in CET-4 Everybody! 题意: 总共n张牌,双方轮流抓牌,每人每次抓牌的个数只能是2的幂次(即:1,2,4,8,16-),抓完牌,胜负结果也出来了:最后抓完牌的人为胜者.给出n,问先手赢还是后手赢? PS:当然这题可以直接推出 n%3==0必败,否则必胜. //巴什博奕 下面介绍另外一种做法 SG值:一个点的SG值就是一个不等于它的后继点的SG的且大于等于零的最小整数.//同mex()函数 简单点来讲就是当前状态离最近一个必败点的距离. SG(

巴什博奕

巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜.因此我们发现了如何取胜的法则:如果n=(m+1)*r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜.总之,要保

博弈:巴什博奕(Bash Game)威佐夫博奕(Wythoff Game)尼姆博奕(Nimm Game)

巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜 对于巴什博弈可以考虑:n=(m+1)*k+s,即如果n%(m+1)!=0则先取者只需取走s物品即可保证获胜. HDU 1846:裸的. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<limits.h> t

博弈论一 [ 巴什博奕 ]

首先,这基本是关于ACM博弈论得一系列文章吧. 今天先讲一个最简单得博弈--巴什博奕. 其游戏规则是这样的: 有一堆n个石子,两个足够聪明的人玩,每个人可以去1-m个石子,取到最后一个石子为胜. 比如 n=7 ,m =3 那么先手必胜,过程大概如下, 先手取3,后首取i个,先手则拿4-i个,这样先手就拿到最后的石子了.(3+i+4-i=7,所以4-i就包含最后一个). 那么其实想法很简单. 当n%(m+1)==0,先手必输,否则先手必胜. 为什么? 当n%(m+1)==0,时,先手取i个,后手去

http://codeforces.com/gym/100694/problem/M The Fifth Season (巴什博奕)

题目链接 一直觉得巴什博奕是最简单的博弈遇到肯定没问题,结果被虐惨了,看完标程错了10多遍都没反应过来,当然标程题解和代码的意思也写反了,但是还是想对自己说一句mdzz,傻啊!!!这道题很不错,我觉得很有必要拿来写一篇博客. 题意:n个石子,两个人轮流取,q次询问,每次询问给定k和l,取的石子数目在k到l之间,假设两个人的取法都为最佳即向着自己赢的目标取,问一共能取多少次. 题解:巴什博奕,接下来的叙述中用a和b代替k和l.根据巴什博奕,首先ans=n%(a+b)*2是肯定的,问题就在于余数p.