【算法】 Fibonacci Nim

问题

有一堆个数为 n n n 的石子,先手第一次可以取任意个石子,但不能取完,之后每次取的石子个数最多只能是上一次的两倍,不能不取,取走最后一个石子的人胜,问先手必胜还是后手必胜

结论

n n n 是斐波那契数时,先手必败,否则先手必胜

证明

Zeckendorf(齐肯多夫)定理

内容:任意正整数都可以表示为若干个不连续的斐波那契数之和
证明:数学归纳法
假设对于 < m <m <m 的所有正整数都满足定理,考虑 m m m 是否满足

  1. m m m 是斐波那契数,定理成立
  2. m m m 不是斐波那契数,设 f i b k < m < f i b k + 1 fib_k<m<fib_{k+1} fibk<m<fibk+1
    那么令 m ′ = m − f i b k < f i b k + 1 − f i b k < f i b k − 1 m'=m-fib_k<fib_{k+1}-fib_k<fib_{k-1} m=mfibk<fibk+1fibk<fibk1
    由数学归纳法可得 m ′ m' m 可分成若干个不连续的斐波那契数之和
    因为 m ′ < f i b k − 1 m'<fib_{k-1} m<fibk1,所以构成 m ′ m' m 的最大斐波那契数 f i b t < f i b k − 1 fib_t<fib_{k-1} fibt<fibk1,一定不与 f i b k fib_k fibk 连续,定理成立

证明 f i b − n i m fib -nim fibnim 的结论同样用数学归纳法证明

若对于 1 1 1 n − 1 n-1 n1 都满足 f i b − n i m fib-nim fibnim 的结论,证明 n n n 也满足

证明当 n n n 不是斐波那契数

根据齐肯多夫定理, n = f i b k + . . . + f i b l + f i b t ( k > . . . > l > t ) n=fib_k+...+fib_l+fib_t(k>...>l>t) n=fibk+...+fibl+fibtk>...>l>t),且 k , . . . , l , t k,...,l,t k,...,l,t 不连续
先手先取 f i b t fib_t fibt,那么后手一定取不完 f i b l fib_l fibl,那么问题就变成了一个后手先取的 n n n 是斐波那契数 的子问题,有数学归纳法可知,后手第一次取任意石子都是必败的,那么第一次取范围更小的石子一定也是必败的
所以后手必败,先手必胜

证明当 n n n 是斐波那契数时,先手必败

n = f i b k + 1 = f i b k + f i b k − 1 n=fib_{k+1}=fib_k+fib_{k-1} n=fibk+1=fibk+fibk1,先手第一次取 z z z 个石子
z > = f i b k − 1 z>=fib_{k-1} z>=fibk1 时,因为 2 ∗ f i b k − 1 > = f i b k 2*fib_{k-1}>=fib_k 2fibk1>=fibk,所以后手一定可以取到 f i b k fib_k fibk,先手必败
z < f i b k − 1 z<fib_{k-1} z<fibk1 时, f i b k < n − z < f i b k + 1 fib_{k}<n-z<fib_{k+1} fibk<nz<fibk+1,所以 n − z n-z nz 不是斐波那契数
n − z = f i b k + . . . + f i b t n-z=fib_k+...+fib_t nz=fibk+...+fibt,根据之前的推理,后手下一步一定取 f i b t fib_t fibt,当 f i b t < = 2 z fib_t<=2z fibt<=2z 时,得证,一下证明 f i b t > 2 z fib_t>2z fibt>2z 是不可能出现的
反证法:假设 f i b t > 2 z fib_t>2z fibt>2z,所以 z < f i b t − 1 z<fib_{t-1} z<fibt1
因为 n n n 是斐波那契数,所以 n = z + ( n − z ) < f i b k + . . . + f i b t + f i b t − 1 n=z+(n-z)<fib_{k}+...+fib_t+fib_{t-1} n=z+(nz)<fibk+...+fibt+fibt1
根据齐肯多夫定理, n n n 分解出来的斐波那契数一定是不连续的
所以就算后面的斐波那契数可以一直往前合并,也一定有 n < f i b k + f i b k − 1 = f i b k + 1 n<fib_k+fib_{k-1}=fib_{k+1} n<fibk+fibk1=fibk+1,矛盾

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Fibonacci Nim是一个游戏,与Fibonacci数列有密切关系。根据引用\[1\]的描述,先手胜利的条件是硬币数量不是Fibonacci数。换句话说,必败态构成Fibonacci数列。如果硬币数量是Fibonacci数,那么后手必胜。这是因为先手只能在Fibonacci数列中的一堆中取硬币,而后手可以根据上一个问题的子问题的解决方案取走该堆最后一枚硬币,从而剩下的一堆硬币也可以如此拆分,使得先手必败。如果硬币数量不是Fibonacci数,根据Zeckendorf定理,可以将硬币数量表示为不连续的Fibonacci数之和。在这种情况下,先手可以先取完最小的一堆硬币,而后手无法取完剩下的最少的一堆硬币,从而面对必败态。因此,先手可以在每一堆中取到最后一枚硬币,从而获胜。\[2\]根据引用\[3\]中的代码,可以通过判断硬币数量是否是Fibonacci数来确定先手或后手的胜利。如果硬币数量是Fibonacci数,输出"Second win";如果不是,输出"First win"。 #### 引用[.reference_title] - *1* *3* [斐波那契博弈](https://blog.csdn.net/iteye_6233/article/details/82396581)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Fibonacci Nim(斐波那契尼姆)游戏](https://blog.csdn.net/darren0424/article/details/101639021)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值