关于Fibonacci博弈的一些学习

关于Fibonacci博弈的一些学习

一道例题

问题

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

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

    问先手是否有必胜策略。

分析

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

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

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

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

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

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

我们设n=fibi

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

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

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

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

我们分两种情况来讨论:

  1. x<fibk1

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

    因为我们之前假设过 ik 时都成立,

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

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

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

    我们使用反证法来证明。

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

    那么我们设后手在k1里的最后一次取完时的数量为 y y要满足的条件是 yfibk2

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

    将上面那个式子拆开: y2fibk12y , 移项: y23fibk1

    联立上面的两个不等式:

    {yfibk2y23fibk1

    所以只要证不存在这样的 y ,即23fibk1<fibk2

    继续化简: fibk>43fibk1

    fibk 拆掉然后再把 fibk1 移过去: fibk2>13fibk1

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

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

    • xfibk1

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

      我们要证的是: 2xfibk

      只要证: 2fibk1fibk (进行一些放缩)

      只要证: fibk1fibk2

      Fibonacci

      fibk1fibk2

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

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

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

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

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

      x=fiba1+fiba2+...+fiban(a2a1>1,a3a2>1,...,anan1>1)
      的形式。

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

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

      aiai1>1(i>1)

      fibai>2fibai1

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值