关于Fibonacci博弈的一些学习

一道例题

问题

给定n(n≥2)个石头,游戏双方轮流取至少一个石子,取到最后一个石子的人算赢,但是要满足一下规则:

  1. 第一次取不能全部取完所有的石子。
  2. 设前一次取的石子数为m,这次取的石子的数量不能超过2m。

    问先手是否有必胜策略。

分析

当时看到这道题(当时看的还是加强版)的时候第一反应是设计DP。

计fi,j为还剩下i 个石头,取的上限为j时是否有必胜策略。然后依题意DP或记忆化搜索转移即可。

然而这样显然是不能通过本题的,因为数据范围比较大。

这里引(bai)入(du)一个结论:

如果n是一个斐波那契数,那么一定是必败态(与上限无关,只要不能直接全部取完)。

我们来考虑用数学归纳法来证明:

我们设n=fibi。

当n=2时,先手只能取一个,后手一定可以取到最后一个,所以必败。

当n>2时,我们假设i≤k时,结论都成立。那么只要证i=k+1时结论成立。

根据Fibonacci数列的定义:fibk+1=fibk+fibk−1 ,我们可以把fibk+1堆石子分为fibk和fibk−1两堆。

设先手取的石子数为x。为了方便起见,我们称数量为fibi的石子为第i组。

我们分两种情况来讨论:

  1. 若x<fibk−1

    那么此时我们就可以先递归到k−1 的时候去考虑,

    因为我们之前假设过i≤k 时都成立,

    所以此时后手肯定可以取到k−1的最后一个石子。

    然后此时就剩下了fibk 堆石子。

    此时只要证明不论在k−1那堆里面怎么取,取到k那堆时的上限都不会超过fibk。(这样子的话情况就可以变为k堆的情况,由于前面我们的假设所以它就是成立的。)

    我们使用反证法来证明。

    我们先假设存在一种情况使得后手取完k−1堆里的最后一个石子之后,先手可以一次性取完k堆里的所有石子。

    那么我们设后手在k−1里的最后一次取完时的数量为y。y要满足的条件是y≥fibk2 。

    剩下的那一堆的数量为fibk−1−y 。要使得y尽可能地大,前一次取的石子也得尽可能地大,所以我们假设剩下的全取。那么就得满足y≤2(fibk−1−y) (游戏规则)。

    将上面那个式子拆开:y≤2fibk−1−2y, 移项:y≤23fibk−1 。

    联立上面的两个不等式:

    {y≥fibk2y≤23fibk−1

    所以只要证不存在这样的y,即23fibk−1<fibk2 。

    继续化简:fibk>43fibk−1

    把fibk 拆掉然后再把fibk−1移过去:fibk−2>13fibk−1

    上面那个式子可能再用个归纳法什么的应该能证吧。。。由于篇(懒)幅(癌)问(发)题(作)我就不具体证明了。。。(其实大家写几项应该也能看的出来吧)

    假装我们证完了上面那个式子以后,那么原命题也就得证了。

  2. 若x≥fibk−1

    那么后手就可以直接取完。考虑证明:

    我们要证的是:2x≥fibk。

    只要证:2fibk−1≥fibk (进行一些放缩)

    只要证:fibk−1≥fibk−2

    ∵Fibonacci数列是一个递增的数列
    ∴fibk−1≥fibk−2

    以上步步可逆,所以原命题得证。

综上所述,当n为Fibonacci数时,先手处于必败态。

那么对于不是Fibonacci的数呢?我们引入一个定理:

“Zeckendorf定理”(齐肯多夫定理):任何正整数可以表示为若干个不连续的Fibonacci数之和。

具体地来说,就是对于一个不是Fibonacci数的数x,可以写成

x=fiba1+fiba2+...+fiban(a2−a1>1,a3−a2>1,...,an−an−1>1)

的形式。

打个比方,x=28可以写成28=21+5+2的形式。

所以先手可以先把最小的那一堆全部取掉,

∵ai−ai−1>1(i>1)
∴fibai>2fibai−1

所以对于每一堆来说都是完全独立的游戏,并且对于后手来说都是必败态。所以先手必胜。

所以,当n为Fibonacci数时,先手必败,否则先手必胜。

关于Fibonacci博弈的一些学习的更多相关文章

  1. hdu 2516(Fibonacci博弈博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516 Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个, ...

  2. POJ3070 Fibonacci[矩阵乘法]【学习笔记】

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13677   Accepted: 9697 Descri ...

  3. hdu 2516 取石子游戏 (Fibonacci博弈)

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

  4. BZOJ3286 Fibonacci矩阵 矩阵 快速幂 卡常

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3286 题意概括 n,m,a,b,c,d,e,f<=10^1000000 题解 神奇的卡常题目 ...

  5. Tensorflow实战Google深度学习框架-总结-1

    第一章:深度学习简介   1⃣️应用有 1.计算机视觉 2.语音识别 3.自然语言处理 4.人机博弈   2⃣️深度学习,机器学习,AI 的关系

  6. AI面试必备/深度学习100问1-50题答案解析

    AI面试必备/深度学习100问1-50题答案解析 2018年09月04日 15:42:07 刀客123 阅读数 2020更多 分类专栏: 机器学习   转载:https://blog.csdn.net ...

  7. ACM训练计划建议(写给本校acmer,欢迎围观和指正)

    ACM训练计划建议 From:freecode#  Date:2015/5/20 前言: 老师要我们整理一份训练计划给下一届的学弟学妹们,整理出来了,费了不少笔墨,就也将它放到博客园上供大家参考. 菜 ...

  8. ACM训练计划建议(转)

    ACM训练计划建议 From:freecode#  Date:2015/5/20 前言: 老师要我们整理一份训练计划给下一届的学弟学妹们,整理出来了,费了不少笔墨,就也将它放到博客园上供大家参考. 菜 ...

  9. 从马文到AlphaGo AI走过了怎样的70年?

    (原标题:从马文·明斯基到AlphaGo,人工智能走过了怎样的70年?) [编者按]从19世纪中叶人工智能的萌芽时期,到现今人工智能的重生,从马文·明斯基到AlphaGo,历史上发生了哪些激动人心的故 ...

随机推荐

  1. MySQL -2- 体系结构-多实例模块

    0.在已创建mysql,port=3306的数据库前提下 需要删除/etc/.my.cnf再做以下操作 cp /etc/my.cnf /etc/my.cnf.3306 1.mkdir -p /u02/ ...

  2. C语言---进制

    1. 何为进制 进位机制,逢几进一.数值某一位置上的数在运算时是逢几进一. 生活中的进制:十进制.十二进制(12个月是1年).六十进制(60秒是1分钟) 计算机编程中的进制:二进制.八进制.十六进制. ...

  3. Linux的环境变量.bash_profile .bashrc profile文件

    Shell变量有局部变量.环境变量之分.局部变量就是指在某个Shell中生效的变量,只在此次登录中有效.环境变量通常又称“全局变量”,虽然在Shell中变量默认就是全局的,但是为了让子Shall继承当 ...

  4. Codeforces 1220C. Substring Game in the Lesson

    传送门 首先显然的,如果 $l$ 能移动,那么 $r$ 一定可以随便移动,如果 $l$ 不动,那么 $r$ 一定不能动 那么我们现在只要考虑 $l$ 的移动即可 考虑找到位置 $k$ 之前的最左边的最 ...

  5. RabbitMQ入门教程(十七):消息队列的应用场景和常见的消息队列之间的比较

    原文:RabbitMQ入门教程(十七):消息队列的应用场景和常见的消息队列之间的比较 分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 这是网上的一篇教程写的很好,不知原作 ...

  6. vim最常用命令

    vi/vim常用命令汇总 vi/vim概述 vi/vim是Linux和Unix下的一款非常强大的编辑器,vim是vi的增强 版,命令更加多种和复杂,但是最常用的也就是那几个. vi有三种模式 命令行模 ...

  7. java学习笔记(4)多态

    一.多态 --------------------------------------------- 1.定义:某一类事物的多种存在形态 例如:动物中猫,狗. 猫这个对象对应的类型是猫类型 猫 x  ...

  8. jsp+servlet实现文件上传下载

    相关素材下载 01.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  9. Android判断是debug还是release模式

    1.当有些功能不希望在release模式实现时,但是debug模式又需要的时候,就可以对当前版本模式进行判断.如是debug模式则日志输出级别设置为Level.DEBUG,release模式设置为Le ...

  10. func_get_args func_num_args 的使用

    func_get_args是获取方法中参数的数组,返回的是一个数组,与func_num_args搭配使用: func_num_args一般写在方法中,用于计数 function eeee($a='gg ...