Fibonacci Game
1 1 2 3 5 8 13 21 34 55 89 144
题目描述:有一堆石子一共n个,两人轮流取。(1)先手不能第一次把石子取完(2)之后的人取石子数量都要介于1~前面那个人取石子的两倍。问先手赢还是后手赢。
证明必败状态:
i=2,先手只能取1颗,先手的必败态。(i代表第i个Fibonacci数,f[i]代表第i个Fibonacci数的值,k也是同理)
假设i<=k成立,则i=k+1时,f[i]=f[k-1]+f[k],如13=5+8;
(1)如果先手取的值大于等于f[k-1],后手可以一次性将f[k]取完。因为2*f[k-1]>f[k],如10>8;
(2)如果先手取少于f[k-1],由假设可预测后手总能取最后一颗。证明如下:如果先手取y,后手取x。设y>=f[k-1]/3,对于k-1这小堆,现在剩下的数量小于等于2*y,后手可以一次将所剩的取完。x=f[k-1]-y,x<=f[k-1]*2/3。那么f[k-1]*2/3和f[k]/2的值谁大呢?也就是4*f[k-1]和3*f[k]的值哪个大?由例子可得20<24(其实可以用数学证明,水平有限,特殊值来验证)也就是x<f[k]/2,后手取完第k-1堆后,先手不能取完f[k],由假设可得,对于第k堆,后手仍能取完最后一颗,后手必胜。
证毕,即对于任意的Fibonacci数,都是一个P态,即先手必败。
证明必胜态:
如果n=85,即不是Fibonacci数,85=55+21+8+1。由Zeckendorf(齐肯多夫)定理知:任何非Fibonacci数总可以由有限多个Fibonacci数组成。n=f[a1]+f[a2]+f[a3]....+f[ap](a1>a2>a3...ap)。令先手将f[ap]取完,a(p-1)>ap+1,例:8>2。f[a(p-1)]>f[ap]*2,后手不能一次将a(p-1)这堆取完,即后手将面临这个a(p-1)堆的子游戏,必败态。后续的每一堆,先手可取该堆的最后一颗。即先手获得最终的胜利。
证毕。