斐波那契博弈
有一堆个数为n的石子,A,B轮流取石子,满足:
(1)先手不能在第一次把所有的石子取完;
(2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间
(包含1和对手刚取的石子数的2倍)
同之前的不同点就是:取的规则动态化
约定取走最后一个石子的就是赢家
就连我看博弈名都知道 这必须要使用斐波那契数列
这里需要借助齐肯多夫定理:(证明自己看)
任何正整数可以表示为若干个不连续的斐波那契数之和
对于所有的正整数适应
首先给出3个定理
1$.fib_{n+1}<fib_n*2<fib_{n+2} $这个应该可以明白
\(fib_{n+1}=fib_n+fib_{n-1}\)
并且$fib_n>fib_{n-1} $
$fib_n*2>fib_{n+1} $
同理
\(fib_{n+2}=fib_n+fib_{n+1}\)
并且$fib_{n+1}>fib_n $
所以\(fib_{n+2}>fib_n*2\)
2.\(fib_{n+2}<fib_n*3\)
\(\ \ \ \ \ fib_{n+2}\)
\(=fib_{n+1}+fib_n\)
\(=fib_n+fib_{n-1}+fib_n\)
\(=fib_n*2+fib{n-1}\)
且$fib_{n-1}<fib_n $
所以$fib_{n+2}<fib_n*3 $
3.\(3*fib_{n+1}>4*fib_n\)
也就是\(3*fib_{n-1}>fib_n\) 由定理2 成立
数学归纳法证明:
1.若当前只有一颗也就是\(i=2\) 先手只有一颗可取
显然是必败 成立
2.假设所有\(i<=k\)均成立
那么\(i=k+1\)时 \(fib_i=fib_k+fib_{k-1}\)
那么把石子分为两堆 \(fib_k\)以及\(fib_{k-1}\)
首先 先手绝顶聪明的话取得石子数一定\(<fib_{k-1}\)
因为\(fib_k<fib_{k-1}*2\)
对于当前小堆\(fib_{k-1}\)一定可以明白的是
根据假设无论先手如何取 后手总是可以取到最后一颗
分析一下后手最后去了\(x\)颗
若先手第一次取了$y>=\frac{fib_{k-1}}{3} $
那么剩余小堆\(<=2y\) 后手可以直接取光
\(x=fib_{k-1}-y<=\frac{2*fib_{k-1}}{3}\)
我们比较一下\(\frac{2*fib_{k-1}}{3}\)以及\(\frac{fib_k}{2}\)
也就是\(4*fib_{k-1}\)以及\(3*fib_k\)
由定理3可得 后者大于较大
所以先手无法一次性取光\(fib_k\)这一堆
那么根据之前结论 后手必胜
若先手第一次取了$y<\frac{fib_{k-1}}{3} $
由于\(fib_{n+2}<3*fib_n\)
所以\(y<fib_{k-3}\)
那么感性的理解一下 后手总是可以取走一些石子
然后使先手面临\(fib_{k-2}\)的局面 这样的话后手还是可以取走最后一个
这样的话还是先手必败
所以\(i=k+1\)时 结论依然成立
不是\(Fibonacci\)数列时 先分解
分解时尽量取较大的\(Fibonacci\)数
例如分解85:
\(55<=85<=89\)所以就是\(85=55+30\)
以此类推就是\(85=55+21+8+1\)
\(n=fib_{p_1}+fib_{p_2}+fib{p_3}+......+fib_{p_k}(p_1>p_2>p_3>......>p_k)\)
又因为各个\(fib\)之间不连续
所以\(p_{k-1}>p_k+1\) 所以\(fib_{p_{k-1}}>fib_{p_k}*2\)
先手先取走\(fib_{p_k}\)
那么后手只可以取\(fib_{p_{k-1}}\)并且不可以取完
那么后手面临这个子问题
\(fib_{p_{k-1}}\)并且是后手先取
那么由上可得先手一定可以取走最后一颗
同理对于以后的每一堆都是如此
得证