事实上我也不知道这算是哪个类型的博弈

是在复习$NOIP$初赛的时候看到的一个挺有趣的博弈

所以就写出来分享一下

$upd \ on \ 2018.10.12$忽然发现这个其实就是$Fibonacci Nim$...

题目:有n张纸牌,A,B两人轮流按照以下规则取牌。

规则一:A先取,但是不能在第一次将纸牌全部取完,而且至少要取一张;

规则二:每次所取纸牌张数必须大于或等于1,且小于等于对手刚取的纸牌张数的两倍。取到最后一张牌者为胜者。

输入纸牌的张数n,判断A是否必胜,如果必胜,输出”win”,否则输出”lose”。

问题分析:当n较小时,可以归纳如下:

⑴2张牌时,先拿的人必输;

⑵3张牌时,先拿的人必输;

⑶我们先看5张牌的情况,假如我们把取5张牌分成两个步骤:先取前面2张,再取后面3张,为什么可以这样分成两个步骤?因为后取者有这个权力!先者只能取第一张,后者可以取到第二张,这样,后者就必可以取到第5张牌,先者必输。

同样,如果是8张牌时,可以分为:先取前面3张,再取后面5张,后者胜,先者必输。

结论:⑴如果牌的张数$n$是$Fibonacci$数时,先取牌者必败。 ⑵对所有非$Fibonacci$数都是先取人必赢,反之,必败。

下面给出一般性证明:

假设$n<=k$,且牌数为$Fibonacci$数时,都是取牌者必输。

那么$n=k+1$时,因为$F(k+1)=F(k)+F(k-1)$,即要取完$F(k+1)$张牌,可以分成两步:先取完$F(k-1)$张牌,再取完$F(k)$张牌。对于$F(k-1)$张牌,先取A者输!意味着对于$F(k)$张牌,A还得必须先取,所以A输。

那么,牌数为非$Fibonacci$数时,先取牌者有没有必胜的策略呢?

引用一个定理:当一个数不是$Fibonacci$数时,这个数必然等于若干个$Fibonacci$数之和,并且这些$Fibonacci$数在$Fibonacci$数列中都不相邻。

比如:$78=55+23=55+21+2$(其中55,21,2都是$Fibonacci$数);

对于非$Fibonacci$数$a0$,设f(n)是小于4a0$的最大$Fibonacci$数。

$a0=f(n)+…+f(i)+f(j)$,其中$f(j)$是式中最小的$Fibonacci$数,$f(i)$是第二小的$Fibonacci$数。由于$f(i)$、$f(j)$在$Fibonacci$数列中并不是相邻的,所以$f(i)>2*f(j)$。所以先取者可以直接取走$f(j)$张牌,后取者无法一次取走$f(i)$张牌,$f(i)$是$Fibonacci$数,由前面的分析,后取者必败。

结论:对所有非$Fibonacci$数都是先取人必赢,反之,必败。

一种斐波那契博弈(Fibonacci Nim)的更多相关文章

  1. 博弈论基础知识: 巴什博奕+斐波那契博弈+威佐夫博奕+尼姆博弈(及Staircase)(转)

    (一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜.若(m+1) | n,则先手必败,否则先手必胜.显然,如果n=m+1 ...

  2. HDU 2516 取石子游戏(斐波那契博弈)

    取石子游戏 Time Limit: 2000/1000 MS(Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  3. python实现斐波那契数列(Fibonacci sequence)

    使用Python实现斐波那契数列(Fibonacci sequence) 斐波那契数列形如 1,1,2,3,5,8,13,等等.也就是说,下一个值是序列中前两个值之和.写一个函数,给定N,返回第N个斐 ...

  4. 简单易懂的博弈论讲解(巴什博弈、尼姆博弈、威佐夫博弈、斐波那契博弈、SG定理)

    博弈论入门: 巴什博弈: 两个顶尖聪明的人在玩游戏,有一堆$n$个石子,每次每个人能取$[1,m]$个石子,不能拿的人输,请问先手与后手谁必败? 我们分类讨论一下这个问题: 当$n\le m$时,这时 ...

  5. 51Nod 1070 Bash游戏 V4(斐波那契博弈)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1070 题意: 思路: 这个是斐波那契博弈,http://blog.csd ...

  6. hdu2516斐波那契博弈

    刚开始想用sg函数做,想了半天没一点思路啊. 原来这是一个新题型,斐波那契博弈 斐波那契博弈模型:有一堆个数为 n 的石子,游戏双方轮流取石子,满足:1. 先手不能在第一次把所有的石子取完:2. 之后 ...

  7. 51nod Bash游戏(V1,V2,V3,V4(斐波那契博弈))

    Bash游戏V1 有一堆石子共同拥有N个. A B两个人轮流拿.A先拿.每次最少拿1颗.最多拿K颗.拿到最后1颗石子的人获胜.如果A B都很聪明,拿石子的过程中不会出现失误.给出N和K,问最后谁能赢得 ...

  8. {HDU}{2516}{取石子游戏}{斐波那契博弈}

    题意:给定一堆石子,每个人最多取前一个人取石子数的2被,最少取一个,最后取石子的为赢家,求赢家. 思路:斐波那契博弈,这个题的证明过程太精彩了! 一个重要的定理:任何正整数都可以表示为若干个不连续的斐 ...

  9. 第2章 数字之魅——斐波那契(Fibonacci)数列

    斐波那契(Fibonacci)数列 问题描述 递归算法: package chapter2shuzizhimei.fibonacci; /** * Fibonacci数列递归求解 * @author ...

随机推荐

  1. QEMU IO事件处理框架

    Qemu IO事件处理框架 qemu是基于事件驱动的,在基于KVM的qemu模型中,每一个VCPU对应一个qemu线程,且qemu主线程负责各种事件的监听,这里有一个小的IO监听框架,本节对此进行介绍 ...

  2. 测试人员需要了解的sql知识(基础篇)

    这是第一篇关于数据库的,本着详细的原则,基础的还是不能放过,还是那句话,有问题,欢迎指出! ------------------------------------------------------ ...

  3. Andrew Ng-ML-第十八章-大规模机器学习

    1.学习大数据集 图1.学习大数据集 当数据集量为m=1亿时,进行梯度下降将会花费较大时间. 可以使用小量数据集进行训练,然后得出学习曲线. 左图是高方差,右图是高偏差. 总之是要通过高效的学习算法来 ...

  4. 随机模拟MCMC和Gibbs Sampling

    随机模拟 统计模拟中有一个重要的问题就是给定一个概率分布 p(x),我们如何在计算机中生成它的样本.一般而言均匀分布 Uniform(0,1)的样本是相对容易生成的. 通过线性同余发生器可以生成伪随机 ...

  5. [LeetCode] 122. Best Time to Buy and Sell Stock II_Easy tag: Dynamic Programming

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  6. [LeetCode] 560. Subarray Sum Equals K_Medium

    Given an array of integers and an integer k, you need to find the total number of continuous subarra ...

  7. sql 中延时操作

    select 1; WAITFOR DELAY '00:00:30'; select 2; --执行完第一个之后会 延时 30秒,才会执行第二个sql

  8. ExtJs中XTemplate使用(转)

    转自http://www.studyofnet.com/news/408.html 本文导读:XTemplate是Ext.Template扩展的新类,它支持高级功能的模板类,如自动数组输出.条件判断. ...

  9. STA分析(二) multi_cycle and false

    multicycle path:当FF之间的组合逻辑path propagate delay大于一个时钟cycle时,这条combinational path能被称为multicycle path. ...

  10. zw版【转发·台湾nvp系列Delphi例程】HALCON ZoomImageFactor

    zw版[转发·台湾nvp系列Delphi例程]HALCON ZoomImageFactor procedure TForm1.Button1Click(Sender: TObject);var ima ...