取石子游戏Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 23080 Accepted: 7190Description有两堆石子,数量任意,可以不同。
游戏开始由两个人轮流取石子。
游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。
最后把石子全部取完者为胜者。
现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。
Input输入包含若干行,表示若干种石子的初始情况,其中每一行包含两个非负整数a和b,表示两堆石子的数目,a和b都不大于1,000,000,000。
Output输出对应也有若干行,每行包含一个数字1或0,如果最后你是胜者,则为1,反之,则为0。
Sample Input2 18 44 7Sample Output1SourceNOI纠结了好久,也找同学玩了这个游戏,始终没发现什么规律。
后来想起高中一起玩(1,3,5,7)抓石子游戏的同学,就想打电话咨询顺便难一难他,谁知道直接拽给我一个:威佐夫博弈...百度了下终于懂了。
刚开始也想到列出前几种必胜组合,可是脑袋抽风了,(3,5)(5,3)算成两种情况。
= =,我都搞不清楚当时怎么想的了。
下面是度娘关于威佐夫博弈的百科:威佐夫博奕(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。
任何自然数都包含在一个且仅有一个奇异局势中。
由于ak是未在前面出现过的最小自然数,所以有ak> ak-1 ,而bk= ak + k > ak-1 + k-1 = bk-1 > ak-1 。
所以性质1成立。
2。
任意操作都可将奇异局势变为非奇异局势。
事实上,若只改变奇异局势(ak,bk)的某一个分量,那么另一个分量不可能在其他奇异局势中,所以必然是非奇异局势。
如果使(ak,bk)的两个分量同时减少,则由于其差不变,且不可能是其他奇异局势的差,因此也是非奇异局势。
3。
采用适当的方法,可以将非奇异局势变为奇异局势。
假设面对的局势是(a,b),若b = a,则同时从两堆中取走 a 个物体,就变为了奇异局势(0,0);如果a = ak,b >bk那么,取走b - bk个物体,即变为奇异局势;如果a = ak,b <bk则同时从两堆中拿走ak - ab - ak个物体变为奇异局势(ab - ak , ab - ak+ b - ak);如果a >ak,b= ak + k 则从第一堆中拿走多余的数量a - ak即可;如果a <ak,b= ak + k,分两种情况,第一种,a=aj(j < k)从第二堆里面拿走b - bj即可;第二种,a=bj(j < k)从第二堆里面拿走b - aj即可。
结论:两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜;反之,则后拿者取胜。
那么任给一个局势(a,b),怎样判断它是不是奇异局势呢?我们有如下公式:ak =[k(1+√5)/2],bk= ak + k (k=0,1,2,...n 方括号表示取整函数) 奇妙的是其中出现了黄金分割数(1+√5)/2 = 1.618...因此,由ak,bk组成的矩形近似为黄金矩形,由于2/(1+√5)=(√5-1)/2,可以先求出j=[a(√5-1)/2],若a= [j(1+√5)/2],那么a = aj,bj = aj + j,若不等于,那么a = aj+1,bj+1 = aj+1 + j + 1,若都不是,那么就不是奇异局势。
然后再按照上述法则进行,一定会遇到奇异局势。
下面是某大牛的严谨数学证明:版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明/logs/42826226.html大致上是这样的:有两堆石子,不妨先认为一堆有10,另一堆有15个,双方轮流取走一些石子,合法的取法有如下两种:1)在一堆石子中取走任意多颗;2)在两堆石子中取走相同多的任意颗;约定取走最后一颗石子的人为赢家,求必败态(必胜策略)。
这个可以说是MR.Wythoff(Wythoff于1907年提出此游戏)一生全部的贡献吧,我在一篇日志里就说完有点残酷。
这个问题好像被用作编程竞赛的题目,网上有很多把它Label为POJ1067,不过如果学编程的人不知道Beatty定理和Beatty序列,他们所做的只能是找规律而已。
简单分析一下,容易知道两堆石头地位是一样的,我们用余下的石子数(a,b)来表示状态,并画在平面直角坐标系上。
用之前的定理:有限个结点的无回路有向图有唯一的核中所述的方法寻找必败态。
先标出(0,0),然后划去所有(0,k),(k,0),(k,k)的格点;然后找y=x上方未被划去的格点,标出(1,2),然后划去(1,k),(k,2),(1+k,2+k),同时标出对称点(2,1),划去(2,k),(1,k),(2+k,1+k);然后在未被划去的点中在y=x上方再找出(3,5)。
按照这样的方法做下去,如果只列出a<=b的必败态的话,前面的一些是(0,0),(1,2),(3,5), (4,7),(6,10),…接下来就是找规律的过程了,可能很辛苦,但是我写得也不容易,而且我暂时没有看到其他地方有这样的证明过程。
忽略(0,0),记第n组必败态为(a[n],b[n])命题一:a[n+1]=前n组必败态中未出现过的最小正整数[分析]:如果a[n+1]不是未出现的数中最小的,那么可以从a[n+1]的状态走到一个使a[n+1]更小的状态,和我们的寻找方法矛盾。
命题二:b[n]=a[n]+n[分析]:归纳法:若前k个必败态分别为,下证:第k+1个必败态为从该第k+1个必败态出发,一共可能走向三类状态,从左边堆拿走一些,从右边堆拿走一些,或者从两堆中拿走一些.下面证明这三类都是胜态.情况一:由命题一,任意一个比a[k+1]小的数都在之前的必败态中出现过,一旦把左边堆拿少了,我们只要再拿成那个数相应的必败态即可。
情况二(从右边堆拿走不太多):这使得两堆之间的差变小了,比如拿成了,则可再拿成;情况二(从右边堆拿走很多):使得右边一堆比左边一堆更少,这时类似于情况一,比如拿成了 (其中a[m]<a[k+1]) ,则可再拿成;情况三:比如拿成,则可再拿成.综上所述,任何从出发走向的状态都可以走回核中.故原命题成立.以上两个命题对于确定(a[n],b[n])是完备的了,给定(0,0)然后按照这两个命题,就可以写出(1,2),(3,5),(4,7),…这样我们得到了这个数列的递推式,以下我们把这两个命题当成是(a[n],b[n])的定义。
先证明两个性质:性质一:核中的a[n],b[n]遍历所有正整数。
[分析]:由命题一,二可得a[n],b[n]是递增的,且由a[n]的定义显然。
性质二:A={a[n]:n=1,2,3,…},B={b[n]:n=1,2,3,…},则集合A,B不交。
[分析]:由核是内固集,显然。
看到这里大家有没有想到Beatty序列呢,实际上a[n]和b[n]就是一个Beatty序列。
,有,解方程得,到此,我们找到了该必败态的通项公式。
实际上这组Beatty序列还有一些别的性质,比如当一个数是Fibonacci数的时候,另一个数也是Fibonacci 数;而且两者的比值也越来越接近黄金比,这些性质在得到通项公式之后不难证明。
总的来说,这个问题给我们了哪些启示呢?首先用定理所说的方法找核,然后给出核的规律(递推,或是通项)并且证明。
最后附上一张对应的必败态图.有限个结点的无回路有向图有唯一的核的证明:::::。
博弈的图论模型——必败态与核版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明/logs/42653430.html桌子上有15个石子,每人每次可以拿去1个或3个石子,拿走最后一个石子的人赢,列出所有的必败态:0,2,4,6,8,10,12,14。
状态作为结点可以画一张有向图,下面这张图就是这个游戏所对应的:我只列了不大于6的状态,回顾一下胜态和必败态的性质:胜态一定可以通过某种策略走向必败态;而必败态采取任何策略都将走向胜态。
用图论的话来说,因为必败态只能走向胜态,所以任何两个必败态结点之间不可能存在边;因为胜态总能走到必败态,所以对任何一个非必败态的结点,一定存在一个从它指向必败态不妨看看左图中的0,2,4,6,亲自体会一下。
定义:有向图中,集合X中任意两点之间无边,称集合X为内固集。
定义:有向图中,任意不在集合X中的点存在一条指向集合X的边,称集合X为外固集。
定义:有向图中,集合X 既是外固集,又是内固集,称集合X为核。
显然,内,外固集的定义正好针对上面的两句话,而核就是包含所有必败态的集合。
定理:双人博弈中,约定走最后一步为胜,如果有核存在,则其中一方有不败策略。
证明:不妨设A先行动,初始状态不在核中,由于核是外固集,A一定可以采取某种策略把状B;由于核是外固集,所以B不管采取什么策略,都将走出核,所以轮到A的时候,A又可以言之,A可以使B永远面临核内的状态。
无路可走的状态不可能在核外,因为核外总能走到核如果初始状态不在核中,那么利用同样的想法易知B有不败策略。
以上的定理意义是非凡的,虽然这个定理在证明之前我们其实就已经了解了核与必败态的紧博弈游戏来说,找出核是核心问题。
在此之前,先得考察核得存在性:定理:有限个结点的无回路有向图有唯一的核。
证明:核可以用如下的方式找出:首先找出没有后继结点的点集P[1](最基本的必败态,比如上图中的结点0),然后找到那些指向P[1]的结点集合为N[1](最基本的胜态,比如上图的结点1和结点3);然后,除去P[1]和N[1]中的点并除去和这些点关联的边,继续寻找没有后继结点的点集P[2](更高级的必败态,比如上图中的结点2),依次类推,则最后的核为P=P[1]并P[2]并…并P[n]。
很容易说明如此找到的核是内固集,也是外固集,满足核的定义,下面说明一下核为什么不是空集:实际上P[1]就不是空集,对一个没有回路的有向图来说,从图上的某一点出发,就无法回到原来到过的点。