游戏描述:

Fibonacci Nim是Nim游戏的变种,其规则为两名玩家从一堆硬币中交替移除硬币,第一步中,不允许玩家拿走所有硬币,也不允许不取,并且在每次后续移动中,移除的硬币数量最多可以是上一次移除数量的两倍,拿走最后一枚硬币的玩家获胜或者失败,如果判失败,只要第一个人取走\(n-1\)个硬币就必胜

结论

如果双方足够聪明,只要开局硬币数量不是斐波那契数,那么当\(n\)为斐波那契数的时候先手必败(即后手必胜)

证明

如果硬币数量是斐波那契数,设该数为\(F(k+2)\),有\(F(k+2)=F(k+1)+F(k)\),可以将硬币看作两堆\(F(k+1)\)和\(F(k)\),如果先手取走\(F(k)\)及以上,那么后手必胜,(毕竟\(F(k+1)<2*F(k)\)),那么先手只能在\(F(k)\)的一堆中取硬币,就是上一个问题的子问题,那么后手也肯定能取走该堆最后一枚硬币,那么剩下的一堆硬币也可以如此拆分,那么如此先手必败。如果硬币数量不是斐波那契数,根据Zeckendorf定理(齐肯多夫定理),正整数都可以表示成若干个不连续的斐波那契数之和。那么我们可以将硬币数\(n\)表示为\(n=F(a_1)+F(a_2)+.....F(a_n)\),\((a_1>a_2>.....a_3)\),先手可以先取完最小的一堆,由于各个斐波那契数不连续,即有\(F(a_{i-1})>2F(a_i)\),后手肯定取不完剩下的最少的一堆硬币,此时相当于后手面对该游戏的必败态,对于以后的每一堆,先手都能取到这一堆的最后一枚硬币从而获胜

Fibonacci Nim(斐波那契尼姆)游戏的更多相关文章

  1. 10、end关键字和Fibonacci series: 斐波纳契数列

    # Fibonacci series: 斐波纳契数列 # 两个元素的总和确定了下一个数 a, b = 0, 1 #复合赋值表达式,a,b同时赋值0和1 while b < 10: print(b ...

  2. [LeetCode] Fibonacci Number 斐波那契数字

    The Fibonacci numbers, commonly denoted F(n) form a sequence, called the Fibonacci sequence, such th ...

  3. fibonacci数列-斐波那契数列-python编程

    未完待续~ 了解fibonacci数列: 斐波纳契数列(Fibonacci Sequence),又称黄金分割数列. 1,1,2,3,5,8,13,21,34,55,89,144,233,377,610 ...

  4. Fibonacci series(斐波纳契数列)的几种常见实现方式

    费波那契数列的定义: 费波那契数列(意大利语:Successione di Fibonacci),又译费波拿契数.斐波那契数列.斐波那契数列.黄金切割数列. 在数学上,费波那契数列是以递归的方法来定义 ...

  5. 【算法】Fibonacci(斐波那契数列)相关问题

    一.列出Fibonacci数列的前N个数 using System; using System.Collections.Generic; using System.Linq; using System ...

  6. POJ 3070 Fibonacci【斐波那契数列/矩阵快速幂】

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17171   Accepted: 11999 Descr ...

  7. [Amazon] Program for Fibonacci numbers 斐波那契数列

    The Fibonacci numbers are the numbers in the following integer sequence. 0, 1, 1, 2, 3, 5, 8, 13, 21 ...

  8. Computational Complexity of Fibonacci Sequence / 斐波那契数列的时空复杂度

    Fibonacci Sequence 维基百科 \(F(n) = F(n-1)+F(n-2)\),其中 \(F(0)=0, F(1)=1\),即该数列由 0 和 1 开始,之后的数字由相邻的前两项相加 ...

  9. 在sqlserver中做fibonacci(斐波那契)规律运算

    --利用sqlserver来运算斐波那契规律 --利用事物与存储过程 declare @number intdeclare @A intdeclare @B intdeclare @C int set ...

随机推荐

  1. 第二阶段:流程图:8.axure绘制简单业务流程图

    元件库选择流程图 流程图示例 一个简单的注册练习 线上可以写字 作业

  2. Jquery为动态添加的元素添加事件

    $("tbody").on("click","button", function() { var text = $(this).parent ...

  3. IntelliJ Idea中的 Facets 与 Artifacts

    在公司和家用电脑上不同版本的idea做实验发现过程中会有些不同,遇到过一些问题,也正是这些问题使得自己能更进一步了解项目构建过程中的细节,特别记录一下.   这个是[温故知新] Java web 开发 ...

  4. EasyMock.replay()有什么用

    现在很多项目都使用EasyMock来作为单元测试框架. EasyMock一个方法,基本上是三步:EasyMock.expect().EasyMock.replay().EasyMock.verify( ...

  5. 洛谷$P$2252 取石子游戏 博弈论

    正解:博弈论 解题报告: 传送门! 威佐夫博弈板子昂$QwQ$ 关于这一类问题也有个结论,是说,先手必败的状态一定形如$(\left \lfloor i+\phi \right \rfloor,\le ...

  6. docker-管理数据

    管理Docker中的数据 默认情况下,在容器内创建的所有文件都存储在可写容器层中.这意味着: 当该容器不再运行时,数据不会持久存在,如果另一个进程需要,则可能很难从容器中获取数据. 容器的可写层紧密耦 ...

  7. Python学到什么程度可以面试工作(解答一)

    本文整理了 26 个 Python 有用的技巧,将按照首字母从 A~Z 的顺序分享其中一些内容. all 或 any 人们经常开玩笑说 Python 是“可执行的伪代码”,但是当你可以这样编写代码时, ...

  8. Celery 收下这捆芹菜!

    目录 Celery简介 Celery构成 Task Broker Worker Backend Celery使用 安装 基本使用 异步任务: delay 延迟任务: apply_async 周期任务: ...

  9. 【设计模式】 (2)关于UML

    UML -- Unified Modeling Lanaguage(统计建模语言),是一种软件系统分析和设计的语言工具,他用于帮助软件开发人员进行思考和记录思路的结果. UML本身是一套符号的规定,就 ...

  10. Java小白集合源码的学习系列:ArrayList

    ArrayList源码学习 本文基于JDK1.8版本,对集合中的巨头ArrayList做一定的源码学习,将会参考大量资料,在文章后面都将会给出参考文章链接,本文用以巩固学习知识. ArrayList的 ...