題意:給定一堆石子,每一個人最多取前一我的取石子數的2被,最少取一個,最後取石子的爲贏家,求贏家。html
思路:斐波那契博弈,這個題的證實過程太精彩了!spa
一個重要的定理:任何正整數均可以表示爲若干個不連續的斐波那契數的和。.net
1、概括法證實斐波那契數列是必敗點htm
爲了方便,咱們將n記爲f[i]。blog
一、當i=2時,先手只能取1顆,顯然必敗,結論成立。遊戲
二、假設當i<=k時,結論成立。get
則當i=k+1時,f[i] = f[k]+f[k-1]。io
則咱們能夠把這一堆石子當作兩堆,簡稱k堆和k-1堆。margin
(必定能夠當作兩堆,由於假如先手第一次取的石子數大於或等於f[k-1],則後手能夠直接取完f[k],由於f[k] < 2*f[k-1])top
對於k-1堆,由假設可知,不論先手怎樣取,後手總能取到最後一顆。下面咱們分析一下後手最後取的石子數x的狀況。
若是先手第一次取的石子數y>=f[k-1]/3,則這小堆所剩的石子數小於2y,即後手能夠直接取完,此時x=f[k-1]-y,則x<=2/3*f[k-1]。
咱們來比較一下2/3*f[k-1]與1/2*f[k]的大小。即4*f[k-1]與3*f[k]的大小,對兩值做差後不可貴出,後者大。
因此咱們獲得,x<1/2*f[k]。
即後手取完k-1堆後,先手不能一下取完k堆,因此遊戲規則沒有改變,則由假設可知,對於k堆,後手仍能取到最後一顆,因此後手必勝。
即i=k+1時,結論依然成立。
2、概括法證實非斐波那契數爲必勝點
將g[n]=f[a1]+f[a2]+...+f[ap],其中f[ai]爲斐波那契數,先手取最小的堆f[ap],後手只能取f[a(p-1)],這樣就成了面對後手先取斐波那契數的局面,必敗,從而先手必勝。
不得不認可,這兩步證實很nice,第一步證實的嚴謹,第二步證實的漂亮,大腦運做的還不是很快啊~
=================================================================================================
特別感謝:
http://blog.csdn.net/acm_cxlove/article/details/7835016
http://blog.csdn.net/dgq8211/article/details/7602807
http://yjq24.blogbus.com/logs/46150651.html
=======================================================================================================