POJ1067 取石子游戏 跪跪跪,很好的博弈论
取石子游戏
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 29951 | Accepted: 9814 |
Description
Input
Output
Sample Input
2 1 8 4 4 7
Sample Output
0 1 0
Source
(4,7)
分析:这是威佐夫问题,学习了
转自http://yjq24.blogbus.com/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[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数;而且两者的比值也越来越接近黄金比,这些性质在得到通项公式之后不难证明。
总的来说,这个问题给我们了哪些启示呢?首先用定理所说的方法找核,然后给出核的规律(递推,或是通项)并且证明。最后附上一张对应的必败态图.
转自http://yjq24.blogbus.com/logs/42653430.html
上次说了胜态和必败态,还记得最后的练习么?桌子上有15个石子,每人每次可以拿去1个或3个石子,拿走最后一个石子的人赢,列出所有的必败态:0,2,4,6,8,10,12,14。说过了状态作为结点可以画一张有向图,下面这张图就是这个游戏所对应的:
我只列了不大于6的状态,回顾一下胜态和必败态的性质:
胜态一定可以通过某种策略走向必败态;而必败态采取任何策略都将走向胜态。 用图论的话来说, 不妨看看左图中的0,2,4,6,亲自体会一下。 定义:有向图中,集合X中任意两点之间无边,称集合X为内固集。 定义:有向图中,集合X 既是外固集,又是内固集,称集合X为核。 显然,内,外固集的定义正好针对上面的两句话,而核就是包含所有必败态的集合。 定理:双人博弈中,约定走最后一步为胜,如果有核存在,则其中一方有不败策略。 证 明:不妨设A先行动,初始状态不在核中,由于核是外固集,A一定可以采取某种策略把状态走到核中,然后轮到B;由于核是外固集,所以B不管采取什么策略, 都将走出核,所以轮到A的时候,A又可以把状态走进核里。总而言之,A可以使B永远面临核内的状态。无路可走的状态不可能在核外,因为核外总能走到核 内,A可以保持不败。如果初始状态不在核中,那么利用同样的想法易知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]就不是空集,对一个没有回路的有向图来说,从图上的某一点出发,就无法回到原来到过的点。而图中的点又是有限的,所以最后必将在某个结点终止,故P不是空集。
针对不同的游戏,找核是一个麻烦事。首先生成图,有向边取决于游戏规则,然后当我们要找某个必败态的时候,是要先找到之前所有的必败态的,而这正是一个数学问题和一个编程问题的关键差别。在立方和分解问题[unsolved]中, 我的问题的提法都是针对某一个特定输入的n来看是否存在(x,y)满足立方和或者平方和等于n.实际上,如果提法换成,输出对所有不大于n的数中可以被分 解的数,那么这种提法更适合计算机去解决,因为本质上来说,两个问题是不一样的。对于前者我只需要知道有关n的情况就可以了,而对后者,却调动了资源去计 算所有不大于n的数的情况。虽然他们看起来很相近,但是从道理上来说应该后者的劳动量要大得多,可悲的事情就在于,有时候你要算出n的情况,就不得不算一 些比n小的数的情况,而这个计算的数目通常是随着n增大而增大的;另一个可悲的事情是,程序员往往已经习惯了第二种提问方式。数学家希望找到某些必要条件或者充分条件来确定n能否被分解,同样的道理,我们也希望能直接找到必败态的规律,而不真正依赖于象上述定理那样递归的思想从P[1]开始找起,这样来解决问题。
但是,必败态的规律是严格依赖于规则的,这一点对找出必败态的规律来说造成了很大的局限性。这个图的模型在以后还会遇到,到时有更好的方法来寻找必败态。
转自http://yjq24.blogbus.com/logs/42304551.html
高斯取整函数又叫向下取整函数,常见的记法如下: ,既然是向下取整,也就是说[-3.5]=-4,这个取整对负数来说就不是简单地扔掉小数部分,这是要注意的。可以说,高斯取整是联系连续和离散的重要桥梁。
小知识:高斯函数性质
1) x-1<[x]<=x<[x]+1
2) [x+n]=[x]+n,(n为整数)
3) [x]+[y]<=[x+y]<=[x]+[y]+1 //左边由性质2易证,右边利用[x+y]<=x+y<[x]+[y]+2
4) [nx]>=n[x],(n为正整数) //反复利用性质3左边
5) [x/n]=[[x]/n],(n为正整数)
// 换元后等价于证[ny]/n-1<[y]<=[ny]/n,右边由性质4易证,左边有 [ny]/n<=[y]+{y}<[y]+1
欧拉给出过一个很经典的多项式: ,该多项式在n=0,1,2,…,39时产生40个素数。利用高斯取整函数,可以做 一件差不多的事:
,这个函数跳过所有的平方数,而且值域覆盖所有非完全平方数构成的集合,有了上面的这些性质作武器,证明并不难,这里就略去了。
今天的主题还是 Beatty定理 :
正无理数 满足 , 则数列 ; 严格递增, 并且这两个数列构成Z+上的一个分划(也就是它们无交地遍历全体正整数)。
[题解]:
其实作为习题是不难的,显然 ,于是 ,故
Step1.先证明两数列不交:[反证]若 ,有 ,即有 ,
两式相加:得k<m+n<k+1,这和m,n,k都是自然数矛盾;
Step2.再证两数列能取遍所有的正整数:[反证]若k不在 中,则有
于是
两式分别除以 和 后相加:得 ,这和m,n,k都为自然数矛盾.
证毕.
由Beatty定理得到的两个数列称为互质数列,不过别被名称所欺骗,a[n]和b[n]并不能保证对应互质。
//再继续看看必败点
//看完上面的有了点了解吧,代码如下:
#include<iostream> #include<cmath> using namespace std; int main () {int a,b,dif;double p=(sqrt((double)5)+1)/double(2);while(cin>>a>>b){dif=abs(a-b);//取差值a=a<b?a:b;//取较小的值if(a==(int)(p*dif))//判断是不是奇异局势printf("0\n");else printf("1\n");}return 0; }
转载于:https://www.cnblogs.com/cssystem/archive/2013/02/22/2922814.html
POJ1067 取石子游戏 跪跪跪,很好的博弈论相关推荐
- POJ-1067取石子游戏,威佐夫博弈范例题/NYOJ-161,主要在于这个黄金公式~~
取石子游戏 Time Limit: 1000MS Memory Limit: 10000K Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取 ...
- POJ1067 HDU1527 取石子游戏【博弈】
取石子游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- 博弈论之取石子游戏的学习
以下内容来自转载: 博弈问题简介 所讨论的博弈问题满足以下条件: 玩家只有两个人,轮流做出决策 游戏的状态集有限,保证游戏在有限步后结束,这样必然会产生不能操作者,其输 对任何一种局面,胜负只决定于局 ...
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)
Time Limit: 5 Sec Memory Limit: 162 MB Submit: 871 Solved: 365 [Submit][Status][Discuss] Descripti ...
- hdu 2516 取石子游戏
取石子游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- 取石子游戏详解NIM
取石子游戏详解NIM 分类: 编程之美2014-09-13 09:38 478人阅读 评论(3) 收藏 举报 编程之美 目录(?)[+] http://blog.csdn.net/pipisorry/ ...
- 博弈问题-取石子(D题小牛vs小客)附取石子游戏总结
题目: 链接:https://www.nowcoder.net/acm/contest/75/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...
- OPJ-1067 取石子游戏 解题报告(数论) 取石子游戏,betty定理
连接--A - 取石子游戏 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Descrip ...
- bzoj1874: [BeiJing2009 WinterCamp]取石子游戏
1874: [BeiJing2009 WinterCamp]取石子游戏 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 834 Solved: 350 ...
最新文章
- eclipse编辑窗口不见了(打开左边的java、xml文件,中间不会显示代码)
- UA MATH636 信息论5 信道编码定理
- 周报速递丨中国 5G 基站全球占比 70% ;360 宣布转型数字安全公司
- Gibbs sampling [Gibbs采样]
- Mysql学习总结(10)——MySql触发器使用讲解
- CVPR 2020 算法竞赛大盘点
- JS 全局函数 isNaN()、parseInt()、parseFloat()
- WORD里表格(图表、框图、形状)复制到另一WORD里表格会变形的解决办法
- 基于遗传算法的柔性车间调度优化研究附Matlab代码
- iOS 常用动画第三方
- C/C++:实现精灵游戏
- 迎接Ubuntu Flatpak Remix,预装了Flatpak支持的Ubuntu
- 开发者分享在PC上制作iOS游戏的经验(下)
- Bark 使用指南:如何自建 iOS 消息推送服务
- Ubuntu 14.04 Linux 3D桌面完全教程,显卡驱动安装方法,compiz特效介绍,常见问题解答
- 黄聪:【转】C# 对称加密解密算法
- SX1276/77/78学习笔记3 - SX1278 的 FIFO 工作流程和应用注意事项
- linux下tftp32的使用
- 机器学习中的矩阵方法(附录A): 病态矩阵与条件数
- NSFC: 国内外研究现状的几种节奏
热门文章
- power bi 日期计算_2020国内外常用的BI商业智能软件
- c语言数组取出特定字符串,C语言根据特定的符号分割字符串 如:字符串a,bbb,ccc-数组[a,bbb,ccc]...
- 安卓linux终端 计算,5种在Linux终端中进行算术运算的方法
- 最大流matlab代码,计算最小费用最大流MATLAB源代码.doc
- vim配置c语言开发环境变量,gcc配置和vim编程
- 自动填充参数_使用orangehill/iseed自动反向生成数据填充文件
- 【Keras】Win10系统 + Anaconda+TensorFlow+Keras 环境搭建教程
- 为什么8位二进制的取值范围是-128~127
- 转:为什么说GAN很快就要替代现有摄影技术了?
- Qt多线程应用--QRunnable