我只是个搬运工……
博弈论小结
by xaphoenix
写在前面
第一次写一个专题的总结,由于笔者水平有限,所以里面肯定会有很多不恰当之处,希望读者不吝赐教。此外,这个小结中,有大约2000字的直接复制粘贴的知识介绍,有几道题的题目分析或者题意概括来源于网上各位大牛的博客,所以笔者不具有著作权,具体的参考资料在本文最后列出。另外,为了节省页数(准备把这个带到现场),所以排版比较凌乱,字体基本都是五号字,仅仅是在标题处用加粗作为标记,希望读者能理解。本文几乎囊括了所有笔者知道的ACM中有关博弈论的知识内容,如有疏漏之处,希望能在csdn博客上私信我。例如本文由于笔者没有接触到关于纳什均衡和混合纳什均衡(WC2014上介绍过)相应的题目,所以没有深入的学习。例题部分包括了hdu、poj、zoj、bzoj中大多数经典的题目,当然主要的题目列表来源于cxlove的博弈论总结。笔者也会在之后的学习中不断添加例题。由于博弈论是一个需要经验和严谨证明的领域,所以希望能列出较为丰富的题目,能够从中学习掌握到大部分的博弈论知识和技巧。洋洋洒洒23000字,用时两周多完成,笔者也希望能借助此文,和更多对博弈论题目有兴趣的朋友相互交流、学习。
思路清晰的题目
例题 poj1678 I Love thisGame!
题意:给你一个有n个元素的集合。给定一个区间[a,b] (0
分析:很显然的动态规划思路。 例题 hdu3863 No Gambling 题意: 先手连接蓝色的点,从左向右要连出一个桥,如FigureB所示,后手连接红色的点,目的是不让先手完成任务,且红色边与蓝色边不能有任何接触。 分析:显然,先手必胜。先手的初始思路是沿一条不是底端直线的直线连过去,如果后手选择用两边的红点阻挡,显然先手可以选择连接出这条红边其下的一条蓝边。之后再把这些“脱离队伍”的边用纵向的蓝边连起来即可,因为这些边已有一个蓝点,所以后手无法占领或阻挡。 分析决策前后的不变量 (一)考虑奇偶性的变化 例题 hdu1079 Calendar Game 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1079 题意:从当前日期开始,玩家可以选择移动到下一天或者下一个月的同一天(如果月份加1超过12,则进入新的一年;如果移动使得新的日期不合法,则不能移动)。如果一个玩家移动到2001年11月4日,则该玩家胜利;如果一个玩家移动到2001年11月4日以后,则该玩家失败,问先手必胜还是后手必胜。 分析:我们发现,进行一次移动后,日期与月份之和的奇偶性总发生改变(除了9月30日和11月30日)。那么,如果不考虑这两天的情况下,如果初始日期月份与日期之和为偶数,则先手必胜。如果初始日期为9月30日或者11月30日,先手可以选择奇偶性不变的一次日期变化。这样就又成了先手必胜的情况。下面我们考虑是否中间会遇到这两个特殊点。如果初始状态为先手必胜,则先手总存在办法,不到达这个两个特殊点,即(8月30日和10月30日时不选择增加月份,9月29日和11月29日时不选择日期)。如果初始状态为先手必败,同样,后手总有办法不到达这两个特殊点。所以只可能在初始时除于这两个特殊点。即,读入日期后,我们判断日期与月份之和为偶数或为9月30日或为11月30日,先手必胜;否则,后手必胜。 例题 hdu1564 Play a game 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1564 题意:给你一个n*n的棋盘,游戏开始时有一块在拐角处的石子。两个玩家轮流移动该石子,移动时只能移动到相邻且未访问过的点,问先手必胜还是后手必胜。 分析:我们对该棋盘用1*2的长方形进行覆盖。若n为偶数,那么必存在一个覆盖方案。此时先手选择走向与当前状态同处一个长方形内的另一点。这样,无论先手怎么移动,先手必存在一种移动方法。由于这个游戏无平局,所以先手必胜。若n为奇数,我们考虑同样的方法,将n*n的棋盘除去起点的n*n-1格进行覆盖。之后无论先手怎么走,后手都存在一种移动方案,所以先手必败。 例题 hdu4203 Doubloon Game 题意:有n枚硬币,再给你一个数k,每次只能拿k^m枚(m为自然数),两人轮流拿,先拿完者胜。如果先手必败,输出0,否则输出先手保证必胜的情况下第一步最少拿的硬币数。 分析:先考虑k为奇数的情况,此时k的m次方一定为奇数。也就是说,如果n为奇数,那么最后一枚硬币一定是先手拿的,且第一轮只用拿1枚即可。若n为偶数,则先手必败。然后再考虑k为偶数的情况,首先我们可以手算出n=0,1,0,1,```,0,1,k。之后接下来用数学归纳法证明其周期为(k+1)。 例题 bzoj2927 多边形之战 题目:给定一个凸多边形的三角剖分,其中一个三角形被涂成了黑色,每次可以一刀割下一个三角形,割下黑色三角形的人胜利。 分析:建立其对偶图,问题转化为一颗树上有一个黑色节点,每次删去一个叶节点,删去黑色叶节点的人胜利。如果一开始黑色节点就是叶节点,那么先手必胜。其他情况,黑色点必须剩两个白点连在其旁边保证它不为叶节点,否则对方必胜。由于每次只能删去一个叶节点,这种情况下,胜负就只与n的奇偶性相关了。 例题 bzoj1443 游戏Game 题意:给定一个矩阵,一些位置由障碍,先手放置在某个位置,后手移动,先手再移动,一个格子只能经过一次,问是否先手必胜。 分析:在格子上移动,我们很容易想到黑白二染色。这样就转化为了经典的二分图博弈问题。接下来我们考虑移动的方法:对于任意一个点,如果存在一个最大匹配中这个点没有被匹配,则先手从这个点开始存在必胜策略。先手放置后,后手无论走到哪个点,先手一定能沿着匹配边走回去。如果不存在这样的一条边,说明找到了一条增广路,矛盾!所以一定存在匹配边。同理,当二分图存在完备匹配时,先手必败。题目还要求输出所有先手选择后必胜的点,枚举每个未匹配的点,沿着出边、匹配边、出边······这样的顺序深搜,深搜到的所有左侧的点就是左侧的可选点集。 (二)考虑总量的不变性 例题 hdu3544 Alice’s Game 题意:给n块的巧克力,每一块分别是xi*yi的,先手只能竖着切一刀,后手只能横着切一刀。谁不能切谁输,问先手是否有必胜策略。 分析:我们知道,如果一块巧克力被彻底切开,无论切的方式怎样,横切的总长度一定为(x-1)*y,竖切的总长度一定为x*(y-1)。而为了让对方切的次数变少,我们应该尽量让对方每次切的长度长,所以我们采用从中间切开的策略,使得对方每次切的都比较长。相应的,对方每次都选择切长度最小的。 对称构造 例题 hdu3951 Coin Game 题意:n个硬币围成一个圆,每次可以取连续的1~k个硬币,问先手是否有必胜策略。 分析:我们很容易能想到利用对称构造的思路来进行对抗。但是对称构造需要的是两个不相干且完全相同的子问题。本题是一个环,所以我们需要破环为两条相同长度的链。首先我们很容易发现,如果n<=k的话,先手可以一次取完。那么其他情况下,先手取完后会留下一条链。如果该链的长度为奇数,那么后手选取最中间的那一点即可,之后与先手进行对称构造;如果该链的长度为偶数,那么后手应该选取最中间的两点,但是注意k=1的情况需要特殊讨论,之后进行对称构造即可。 例题 poj2484 A Funny Game 题意:有N个硬币围成一圈,两个玩家轮流从中拿1个或者相邻的两个。先拿完者胜利,问是否先手必胜。 分析:如果n<2,显然先手必胜。如果n>=3,一定后手必胜:若n为偶数,则先手取完1个或两个后,后手选取同样的个数,所拿的硬币需要与先手拿的呈中心对称,这样就变成了两条完全相同的链,后手必胜。如果n为奇数,则先手取完1个或两个后,后手选取不同的个数,所拿的硬币同样需要与先手所拿的硬币呈中心对称。同样后手必胜。 从特殊情况入手 (一)从最简单的必胜态入手 例题 hdu1525Euclid’s Game 题意:给定两个正整数a,b。每次操作,可以将大的数减掉小的数的整数倍(减去后不能为负数)。如果一个操作者,将a,b中一个数变成0时游戏结束,并且该玩家胜利。求先手必胜还是后手必胜。 分析:不妨设a>=b,我们很容易发现,当a%b=0时,当前操作者必胜。如果a>=2*b时,当前操作者依然有必胜策略:如果a%b,b是必胜态,则先手将a,b变成a%b+b,b,这样后手只能将其变成a%b,b,然后先手必胜;如果a%b,b是必败态,则先手将a,b变成a%b,b,然后后手会输掉比赛。如果b
例题 poj1740 A New StoneGame / bzoj1982 Moving Pebbles 题意:有n堆石子,两个人轮流操作,每次操作分两步,第一步从某堆中去掉至少一个,第二步,可以把该堆剩余石子的一部分分给其它的某些堆(可省略)。问是否先手必胜。 分析:1堆显然是一个必胜点。考虑两堆的状况,双方的目的都是逼对方至两堆都是1的情况。如果一开始两堆的状况相同,那么后手可以模仿先手的做法,这样后手必胜。其他情况下,先手可以将两堆的情况传化为两堆相同,此时先手必胜。3堆时,先手可以通过对石子数最多的那一堆进行操作,使得情况传化为两堆相同的情况。此时先手必胜。猜想对于n堆石子,当且仅当n为偶数,且n对石子可以分成n/2对两两相同的堆时先手必败。对于必胜态:n为奇数时,选最大和最小的两堆,易知可以对最大堆操作,使得剩下的偶数堆两两相等。n为偶数且不满足n/2对两两相同时,根据同样的做法,同样可以转移到必败态上。对于必败态:无论取哪堆都不能使得剩下的石子变成n/2对两两相同的状态。 (二)从最简单的必败态入手 例题 hdu2147 kiki’s game 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2147 题意:在一个n*m的矩阵中起始位置(1,m),走到终止位置(n,1);游戏规则是只能向左,向下,左下方向走,想走到终点的为获胜者。 分析:最容易想到的必败态就是1*1的矩阵,此时先手必败。那么1*2,2*1,2*2都为先手必胜。假设先手当且仅当面对n和m全为奇数的矩阵时必败,利用数学归纳进行考虑。如果当前状态为两偶,则其沿对角线走,对手面对的将是两奇,此时先手必胜;如果当前状态为一奇一偶,则其沿偶的那个方向走,对手面对的仍然是两奇,此时先手必胜;如果当前状态为两奇,无论其怎么走,也不能给对手留下两奇的状态,此时先手必败。 (三)从固定参数的情况进行讨论 例题 hdu1538 A Puzzle forPirates 题意:有n个海盗,分m块金子,其中他们会按一定的顺序提出自己的分配方案,如果50%以上的人赞成,则方案通过,开始分金子,如果不通过,则把提出方案的扔到海里,下一个人继续。 分析:经典的海盗分金问题。看了cxlove大神的博客才会的。我们先考虑n<=2*m的情况:如果只有1号和2号,那么根据50%的规则,无论2号提出什么条件都能通过,所以2号可以100:0分配。如果有1号2号3号三人,3号为了获得1号的支持,只用给1号一枚金币即可,剩下金币都给自己。同理,4号存在时,会贿赂2号一枚金币,剩下全留给自己。5号存在时会贿赂1号3号各一枚金币,其余留给自己。以此类推。如果n=2*m+1:那么n号海盗为了让其他人支持来保命,会选择把m个金币,给前面2m个人中的m个人,这样就能获得50%以上的支持。下来考虑n>2*m+1的情况。首先,第2*m+1号人的做法同上,第2*m+2号人为了获得支持,将给第2*m+1号人的分配方案中没分配到的m个人金币,这样就能拥有50%的支持。第2*m+3号人无法获得支持,所以他提出的方案一定无法通过,只能选择支持后面的人。2*m+4号有了前2*m个人中m个人的支持,和2*m+3号的支持,他的方案也能通过。第2*m+4、2*m+5、2*m+6、2*m+7同样获得不了足够的支持,而2*m+8的人拥有了50%的支持率,他的方案可以通过。以此类推。我们可以发现,2*m+2^k号海盗的方案可以通过,处在这样两个特殊海盗中间的其他海盗的方案无法通过。 (四)分析参数之间的大小关系 例题 bzoj4147 Euclidean Nim 题意:Euclid和Pythagoras在玩取石子游戏,一开始有n颗石子。Euclid为先手,他们按如下规则轮流操作:若为Euclid操作,如果n
分析:首先我们会发现,如果p和q有最大公约数d,那么当n不是d的倍数时,游戏永远不会停止,反之,我们可以把这个公约数消去,使得p和q互质,并且这种情况下,游戏一定能结束。下面我们分情况讨论: 1、p=q。此时p只能为1,则先手必胜。 2、p>q,n
3、p>q,n>=p。如果先手操作后x>=q,那么后手可以将石子数变成xmod q,就转化为了状态2,先手必败。所以先手只能取成n mod p,然后后手+q,先手-p,这样不停进行下去。所以当(p-q)|(n mod p)且n mod p>q 时先手必胜。 4、若p 5、若p 博弈树 (一)博弈树基础 用搜索去处理一个点的后继状态,如果后继态中有一个必败态,则该点为必胜态,否则为必败态。 例题 hdu1760 A New TetrisGame 题意:给定一个n*m的棋盘(n,m<=50),棋盘的每一格用0,1表示,0表示未占用,1表示已占用,其中0的个数不超过40。现在两个玩家,轮流放置一个2*2的俄罗斯方块,放置的方块之间不能有重叠,且不能放到已占用的格子上。问是否先手必胜。 分析:由于0的个数很少,我们可以用搜索进行递归处理,在每一层中,遍历整个棋盘,枚举放下2*2俄罗斯方块的位置。返回值为0或1,当且仅当后继状态有一个返回值为0时返回1,其他情况返回0。 例题 hdu4155 The Game of 31 题意:有24张牌,最多由4张1,2,3,4,5,6组成。两个玩家轮流选一张牌,总的牌的点数不能超过31,谁不能选牌谁输。 分析:dfs求解即可。 例题 bzoj3404 Cow Digit Game又见数字游戏 题意:给你一个数,两个玩家轮流操作,可以给原数减去一个原数各个位上最大的数字,也可以给原数减去一个原数各个位上最小的非0数。问是否先手必胜。 分析:暴力求PN表即可。 例题poj2068 Nim 题意:有2n个人,两方各n个人,交叉坐,每个人可以取的石子有一个最大限制,总共有S颗石子,哪一方取了最后一颗石子就输了,问是否先手必胜。 分析:记忆化搜索求PN态即可。 (二)简单优化 例题 zoj2686 Cycle Game 题意:N个点形成一个环,相邻点之间有权值。从0号点开始,可以选择往两边移动,前提是权值为正,移动之后,可以将权值减少一个任意的正数。最后无法移动者输,问是否先手必胜。 分析:对搜索进行优化。我们发现,如果有一个方向上有连续的奇数个非0数,那么先手可以将权值降为0,后手就无法返回了,如果后手也将权值降为0,则最终先手必胜,反之,如果后手不降为0,那么先手返回一步,将权值降为0,出现两边都是0的情况,后手无法移动,此时先手必胜。在这个优化下可以搜索出答案。 例题 zoj3057 Beans Game 题意:有三堆石子,每堆石子的个数都不超过300,两个玩家轮流操作,每次可以从一堆石子拿任意多石子,也可以从两堆石子拿任意多相同的石子。问是否先手必胜。 分析:同样思路是求PN态,但是数据比较大,所以我们需要用dp来递推。 例题 zoj1039 Number Game 题意:我们在2-20这19个数字上进行游戏。两个玩家轮流取数,取完这个数后,这个数的倍数不能再取,而且某两个不能取的和,也不能再取。 分析:利用状压dp来表示每个数字是否被选,然后暴力求pn表即可。 (三)极大极小搜索和alpha-beta剪枝 极大极小搜索:利用估价函数,考虑每一步行动后对先手的价值。那么每次先手搜索时,都会从估价最高的行动策略开始搜索。相应地,每次后手搜索时,都会从估价最低的行动策略开始搜索。 alpha_beta剪枝:alpha记录的是博弈树搜索到当前深度时的最大估价值,也就是最好的情况。beta记录的是博弈树搜索到当前深度时最小的估价值,最坏的情况,利用这两个信息进行剪枝,使得搜索加快。 例题 poj1085 Triangle War 题意:给出10个点,总共18条边,两个玩家轮流加入一条边,如果形成一个三角形,则三角形归当前玩家所有,并且可以额外再走一步。最后三角形多的人获胜,问是否先手必胜。 分析:构建估价函数,利用极大极小搜索和alpha-beta剪枝来优化博弈树搜索。 经典博弈问题及其拓展问题 (一)巴什博奕(BashGame) 游戏情形:n个物品组成一堆,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个,最后取尽物体一方赢。 对抗策略分析:考虑n对m+1取模的余数。如果为0,那么如果先手取k个(0 例题 hdu1846 Play a game /hdu2188 悼念512汶川大地震遇难同胞——选拔志愿者 / hdu2149 Public Sale 题意/分析:巴什博奕原型 例题 poj2368 Buttons 题目链接:http://poj.org/problem?id=2368 题意:有一堆物品,给你物品的个数k,让你找出最小的那个L(每个玩家最多取的物品的个数),使得先手必败,如果不能则输出0。 分析:根据巴什博奕,我们需要找出一个最小的L使得k%(L+1)=0,暴力找出k的所有因数即可。 例题 hdu1847 Good Luck inCET-4 Everybody! 题意:n张牌,两位玩家每次能抓取的牌数为2的自然数次幂。问先手必胜还是后手必胜。 分析:注意到2的幂中包含1和2两个,我们可以考虑n模3的情况。如果n%3=0,则后手总有办法保持n%3=0这个状态,先手必败。如果n%3!=0,则先手总有办法将当前状态转移为n%3!=0上,先手必胜。 例题 hdu2897 邂逅明下 题意:n个硬币,两人轮流取,最少取p个,最多取q个。最后取的人输,问是否先手必胜。 分析:我们利用巴什博奕的思路,将n化成(p+q)*k+r的形式。如果r==0,那么先手取q个,若后手取x,先手则取p+q-x,这样最后给后手留下p个硬币,必须一次取完,此时先手必胜;如果0 例题 hdu1517 AMultiplication Game 题意:初始p=1,两位玩家轮流,给p乘上一个2到9的数,谁先使得p超过给定的n谁胜利。 分析:如果刚开始的数时位于2-9之间的,那么先手必胜。如果刚开始的数时位于10-18的,那么先手必败,因为无论先手选什么,后手只要乘以2就能够到达10-18之内的所有数。如果刚开始的数位于19-162,那么先手必胜,可以这么想,先手选一个9,那么后手乘以一个数后,Num>=18,此时先手再乘以9,那么就大于162之内的任何数了。如果刚开始的数位于163-324时,那么先手必败,可以这么考虑,后手可以控制一个数到达9-18之间,那么先手如果乘个2的话(乘以大的那就更不用说了),那么就会到达18-36这个区间,此时后手再乘以9,那么就可到达163-324之间的任何数。以此类推,不断除2、除9循环,找到其所在区间即可。 (二)威佐夫博弈(Wythoff Game) 游戏情形:有两堆数量各若干的物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取尽物体一方赢。 对抗策略分析:我们用(ak,bk)(ak<=bk,k=0,1,2,···,n)表示两堆物品的数量并称其为局势。如果甲面对(0,0),那么甲已经输了,这样的局势我们称为奇异局势。前几个奇异局势为:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。可以看出,a0=b0=0,ak是未在前面出现过的最小的自然数,而bk=ak+k。奇异局势有如下三个性质: 【性质1】 任何自然数都包含在一个且仅有一个奇异局势中。 【性质2】 任意操作都可以将奇异局势变为非奇异局势 【性质3】 采用适当的方法,可以将非奇异局势变为奇异局势 分析:假设面对的局势是(a,b)。 如果b=a,则同时从两堆中取走a个物体,就变成了奇异局势(0,0)。 如果a=ak,b>bk,则取走b-bk个物体,则变为奇异局势。 如果a=ak,b 如果a>ak,b=ak+k,则从第一堆中拿走多余的数量a-ak即可。 如果a a=aj(j ‚a=bj(j 从上述分析得知,两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜;反之,则后拿着必胜。 我们如何判断一个局势是否为奇异局势? 公式: 则我们可以先求出。若,那么,。若,那么,。若都不是,那么就不是奇异局势。 或者我们判断a是否等于 例题poj1067 取石子游戏 / hdu1527 取石子游戏 题意/分析:威佐夫博弈原型 例题hdu2177 取(2堆)石子游戏 题意/分析:威佐夫博弈原型,要求输出第一步 (三)尼姆博奕(NimmGame) 游戏情形1:有N堆物品,其中第i堆有Pi个物品,每次从某一堆里选出若干物品去掉(但不能不取)。两人轮流取物,谁不能继续取就输了。该问题称为Nim问题。 游戏情形2:有N堆物品,其中第i堆有Pi个物品,每次从某一堆里选出若干物品去掉(但不能不取)。两人轮流取物,谁不能继续取就赢了。该问题称为Anti-Nim问题。 对抗策略分析1:假设某个初始局面为先手必胜,那么先手每一步都必须使对手落在必败点,因此,对于每个局面,要么为胜局面,要么为负局面。我们用非0表示胜局面,用0表示负局面。对于某一个局面,若为非0局面,它的任务就是要寻找某一种取法,使局面变为0局面。即他的对手无论怎么取,都会使局面又变成0局面。那么这种对弈又有什么规律呢? 【定理】如果一个局面先手必胜,就称之为N局面,反之称之为P局面。对于一个局面,令。若S=0,则为P局面,否则为N局面。 证明:1)当时,S=0,为P局面,满足条件。 2)当S=0,即。若取堆i中的物品,使得堆i中的物品发生变化,显然它的子局面P的异或和不为0,即为N局面。 3)当S<>0,设S的二进制位是A1···An,考虑第一位是1的情况。在P中取出该位同是1的局面不妨设为P1。可知,令,可知,即N局面至少存在一个子局面是P局面。 例题 poj2234 Matches Game /hdu1849 Rabbit and Grass 题意/分析:尼姆博奕原型 例题 poj2975 Nim / hdu1850Being a Good Boy in Spring Festival / hdu2176 取(m堆)石子游戏 题意:有n堆石子,两人轮流从任一堆中取任意个石子(至少一个),最后一个取石子的人为赢家。题目给出了如何判断当前形势为必胜态的方法。问最后有多少种赢法。 分析:首先求n堆石子数异或后的结果t。如果t=0,则为必败态。否则,我们可以使它变成必败态然后让对手决策。由于双方都是最优策略,第一步决定后,以后的决策也就定了。所以有多少种赢法取决于第一步可以创造多少必败态。我们只要枚举每堆石子的个数,判断有多少组t^a[i]
例题 hdu1730 Northcott Game 题意:在一个n行m列的棋盘上进行一个游戏:每行都有一黑一白两棋子,先手只能移动黑色棋子,后者只能移动白色棋子。每次移动时,都可以将自己的一个棋子移动到同一行的任意位置,但是移动的过程中不能穿过对方的棋子。问是否先手必胜。 分析:首先我们很容易发现,n行的游戏是互不干扰的,此外,我们发现,每一行的游戏情况和取石子是同样的。把每一行两个棋子之间的距离-1作为每一堆的石子个数进行nim游戏,和这个游戏是完全等价的。现在我们考虑为什么对于一行移动棋子等价于取石子。如果A要取k个石子,即要缩短两个棋子之间k的距离,如果B不愿意这样修改,一定会沿反方向移动他的棋子,那么A可以沿B移动的方向移动自己的棋子,始终保持同样的距离。由于棋盘有边界,所以总有一刻B无法这样做。经过这样的变换,题目中描述的游戏就完全等价于Nim游戏了。 例题 zoj3529 A Game BetweenAlice and Bob 题意:给你n个数ai(ai<=5000000),两个玩家轮流操作,可以将其中一个数换成一个非自己的因数。问是否先手必胜。 分析:很容易发现,将一个数替换成一个因数,相当于从原数中去掉几个质因子,所以我们只需要知道每个数的质因子个数,就可以转化成经典的Nim游戏模型了。 例题 zoj3591 Nim 题意:根据题目给出的代码,构造出a数组,问多少种方案使得,将a数组中连续的一段作为Nim游戏每个堆的石子数,先手必胜。 分析:我们考虑先手必败的个数:我们求出a[i]的前缀异或和,我们只要知道在新的a数组中有多少对a[i]、a[j]相等即可,这里我们可以用map简单的维护下。同时还要减去新的a数组中a[i]=0的个数。 例题 bzoj2819 Nim 题意:给定一个棵树,每个节点是一堆石子,给定两种操作:1、改变x号节点的石子数量;2、用从x到y的路径上的所有堆石子玩一次Nim游戏,询问先手是否有必胜策略。 分析:简单的Nim游戏,不过需要用树链剖分来维护下,需要支持单点修改和区间查询。 例题 bzoj3759 Hungergame 题意:给定n个箱子(n<=20),每个箱子里有一些石子,两个人轮流操作,每个人可以进行以下操作之一:1.打开任意多的箱子2.从一个打开的箱子中拿走任意多的石子。不能操作者输,问是否先手必胜。 分析:先给出结论:先手必胜当且仅当给出的数字集合存在一个异或和为零的非空子集,则先手必胜。先证这样一个必败态:当前所有打开的箱子中的石子数异或和为零,且所有关闭的箱子中的石子数的集合中不存在一个异或和为零的非空子集。当前玩家有两种操作,第一种是从一个打开的箱子中拿走一些石子,那么对方可以按照Nim游戏的玩法,使得状态再次回到这种情况上。第二种是打开一些箱子,由于剩下的部分不存在异或和为0的子集,所以当前状态下的异或和必不为0.那么对方同样可以通过操作使得状态回到这种情况上。所以,如果初始状态下,不存在一个异或和为零的子集,先手必败,否则先手必胜。下来我们考虑如何求是否存在这样的子集。由于n很小,我们可以用meetin the middle的方法,将之前得到的装填存在一个map里,不过要注意特判两边什么都不选的这种特殊情况。 对抗策略分析2: 所有物品的数目都为1:显然,若有偶数堆物品堆,则必胜,否则必败。 ‚如果恰好只有一堆物品数目大于1。我们可以把这堆物品取完或取得只剩下1,使得只剩下奇数堆数目为1的物品留给对方,由情况可知,必胜。 ƒ如果有至少两堆物品的数目大于1。考虑异或值:若异或值不为0,则按照Nim走法取石,这样,当对手某次取完物品后,肯定会出现情况‚,必胜。 证明:按照Nim走法,则取完物品后,必定会给对手留下异或值为0的局面,因此不可能给对手留下情况‚的局面,而对手一次最多将一堆物品数大于1的物品堆处理掉。因此情况‚肯定会出现。 例题 zoj2507 Let’s play agame / hdu1907 John / poj3480 John / hdu2509 Be the Winner / bzoj1022 小约翰的游戏John 题意/分析:Anti-Nim原型 (四)巴什博奕的扩展——k倍动态减法游戏 游戏情形:有一个整数S(>=2),先行者在S上减掉一个数x,至少是1,但小于S。之后双方轮流把S减掉一个正整数,但都不能超过先前一回合对方减掉的数的k倍,减到0的一方获胜。问:谁有必胜策略。具有该问题背景的游戏称为k倍动态减法游戏。 对抗策略分析:曹钦翔的《从“k倍动态减法游戏”出发探究一类组合游戏问题》中提到了动态规划的优化算法。这里不再累述。这里介绍下另一种纯数学方法: 1. k=1的情况 我们将石子数n转化为二进制下的表示,那么,先拿者拿走最后一个1,后者一定拿不到比他高的1,那么先拿者一定会赢。当然,如果n最初为2的j次方,那么先拿者当然不能拿走唯一的1,此时先拿者必输,因为无论怎么拿,新的局面将成为之前所述,后拿者拥有了必胜策略。 2.k=2的情况 此时博弈也称为FIB博弈。我们知道任何一个非斐波那契数n都可以写为多个两两不相邻的斐波那契数的和(其中大的那个数必然大于小的那个数的2倍),这样的话,先取者A先拿走一个小的斐波那契数x,那后取者就无法取到另一个较大的斐波那契数y,这样又给A留下了一个斐波那契数,一直递归下去,A一定就是赢着。但是,如果A最初面临的就是一个斐波那契数Fn,而Fn只能写为Fn-1+Fn-2,如果取Fn-2,由于Fn-1<2*Fn-2,所以B可以取完;如果取其他任意一个非斐波那契数m,B得到的剩下的数Fn-m就相当于上面A最初面临的n,即B必胜。 3. k的一般情况 按照之前的思路我们的目的就是要让n写为的形式,而且两两相邻之间的倍数关系应该大于k。这样,先拿者A取走小一点的数n1,后拿者B必然不能取走n2。这样的话,B自然不能取完,所以A获胜。 在解题时,我们应该求出某个数列a[],这个数列要求任何一个不在这个数列里面的数都可以用这个数列里多项的和表示,但须满足前一项的k倍小于后一项的前提条件。为了求出这个数组a,我们引入另一个数组b[],b[i]表示a[0],a[1],a[2],···,a[i]可以找到两项a[x]和a[y]满足a[x]*k=a[i]为止。 接下来的问题就是要解决先拿者第一回合应取走的最小石头数:先从n里减去小于n的最大的a[i],然后递归求这个剩下的n里最大的a[k],n=n-a[k],递归过程一直进行到n=0为止。最后被减去的a[k]即为问题的解。 例题 hdu2516 取石子游戏 题意/分析:k=2时,k倍动态减法游戏原型 例题 zoj2290 Game 题意/分析:FIB博弈,要求输出第一回合应取走的最小石头数。 例题 poj3922 A simple stonegame / hdu2486 A simple stone game / hdu2580 a simple stone game / zoj3599 Game 题意/分析:k倍动态减法游戏原型 (五)尼姆博弈的三种扩展形式 扩展形式1:限定每次取物上限 问题背景:有N堆物品,其中第i堆有pi个物品,每次去掉某一堆最多m个物品,两人轮流取物品,谁不能继续取谁就输了。 【结论1】令S为Pi对m+1取模后异或和的结果,若S=0则为P局面,否则为N局面。 证明:将pi分解为ri和ki,其中ki为(m+1)的倍数。如果对手在ri内取物,则按照Nim游戏的走法,若不然,假设A取x个,那么B就取(m+1-x)个,使得游戏保持原有必胜态或必败态。 例题 hdu1851 A Simple Game 题意/分析:Nim扩展形式1原型。 扩展形式2:每次允许从k堆中取物(Nimk问题) 问题背景:有N堆物品,其中第i堆有pi个物品,每次最多可以从k堆中选出若干物品去掉,两人轮流取物,谁不能继续取谁就输了。 【结论2】我们把pi这n个数转成二进制,然后每位分别相加,每位和%(k+1)即可。如果每一位结果都是0,则为P局面,否则为N局面。 证明:这里直接给出具体做法:设P1P2P3···Pn为n堆物品的数目。Pi为已标记的物品对,D0[i]和D1[i]分别表示所有已标记的物品堆中第i位为0和1的总数。 1)找出加法结果非0的最高位,设为W。 2)找出一个二进制第W位为1、而且未标记的物品堆Pi,将Pi标记,并把它的第W位由1改为0。对于Pi的第1到(W-1)位,逐个判断:第j位如果为0,则D0[j]++;否则D[1]++。 3)若更新后的S某一位非0,且S[i]+D0[i]>K,或S[i]-D1[i]<1,可以通过修改以前已标记的物品堆。 4)如果加法结果已经全部为0,则确认所有已经做得更改,并结束,否则转到1 。 扩展形式3:规定取物方向(阶梯博弈) 游戏情形:博弈在一列阶梯上进行,每个阶梯上放着若干个自然数,两个人进行阶梯博弈,每一步则是将一个阶梯上的若干个自然数移到前面去。以此类推,最后没有点可移动的人输。具有该问题背景的博弈称为阶梯博弈。 【结论3】把所有奇数阶梯看成N堆石子,把石子从奇数堆移动到偶数堆可以理解为拿走石子,即几个奇数堆的石子在做Nim游戏。 证明:假设我们是先手,所给的阶梯石子状态的奇数堆做Nim游戏,先手能必,按照能赢的步骤将奇数堆的石子移动到偶数堆。如果对手也是移动奇数堆,我们继续移动奇数堆。如果对手将偶数堆的石子移到奇数堆,那么我们将这些石子,再移到下一个偶数堆,这样就保持了奇数堆不变,保持了Nim游戏的性质。 例题 poj1704 Georgia and Bob/ hdu4315 Climbing the Hill 题意:从左到右n个格子,某些有石子,每格永远只能有一个石子,每次可以将某个石子向左移若干格,但不能跨越任何石子。两人轮流操作,谁无路可走谁输。 分析:奇异局势必定是两两棋子相邻为一组,前者移动左边的棋子,后者只需紧贴就可以了。所以无需考虑组与组之间的空隙,而组内棋子之间的距离相当于取石子。即阶梯博弈中,第i枚棋子与第i+1枚棋子的距离对应奇数堆的石子数,组和组之间的距离对应偶数堆的石子数。 例题 hdu3389 Game
=p,那么先手取子,石子数变为nmod p,转为状态2,先手必胜。