Fibonacci Nim 斐波那契取石子博弈

2021-06-01 20:28:04 字數 1294 閱讀 1937

有一堆個數為n的石子,遊戲雙方輪流取石子,滿足:

1)先手不能在第一次把所有的石子取完;

2)之後每次可以取的石子數介於1到對手剛取的石子數的2倍之間(包含1和對手剛取的石子數的2倍)。

約定取走最後乙個石子的人為贏家,求必敗態。

這個和之前的wythoff』s game 和取石子遊戲 有乙個很大的不同點,就是遊戲規則的動態化。之前的規則中,每次可以取的石子的策略集合是基本固定的,但是這次有規則2:一方每次可以取的石子數依賴於對手剛才取的石子數。

這個遊戲叫做fibonacci nim,肯定和fibonacci數列:f[n]:1,2,3,5,8,13,21,34,55,89,… 有密切的關係。如果試驗一番之後,可以猜測:先手勝當且僅當n不是fibonacci數。換句話說,必敗態構成fibonacci數列。

就像「wythoff博弈」需要「beatty定理」來幫忙一樣,這裡需要借助「zeckendorf定理」(齊肯多夫定理):任何正整數可以表示為若干個不連續的fibonacci數之和。定理的證明可以在這裡 看到,不過我覺得更重要的是自己動手分解一下。

比如,我們要分解83,注意到83被夾在55和89之間,於是把83可以寫成83=55+28;然後再想辦法分解28,28被夾在21和34之間,於是28=21+7;依此類推 7=5+2,故

如果n=83,我們看看這個分解有什麼指導意義:假如先手取2顆,那麼後手無法取5顆或更多,而5是乙個fibonacci數,如果猜測正確的話,(面臨這5顆的先手實際上是整個遊戲的後手)那麼一定是先手取走這5顆石子中的最後一顆,而這個我們可以通過第二類歸納法來繞過,同樣的道理,接下去先手取走接下來的後21顆中的最後一顆,再取走後55顆中的最後一顆,那麼先手贏。

反過來如果n是fibonacci數,比如n=89:記先手一開始所取的石子數為y,若y>=34顆(也就是89的向前兩項),那麼一定後手贏,因為89-34=55=34+21<2*34,所以只需要考慮先手第一次取得石子數y<34的情況即可,所以現在剩下的石子數x介於55到89之間,它一定不是乙個fibonacci數,於是我們把x分解成fibonacci數:x=55+f[i]+…+f[j],若,如果f[j]<=2y,那麼對b就是面臨x局面的先手,所以根據之前的分析,b只要先取f[j]個即可,以後再按之前的分析就可保證必勝。

下證:f[j]<=2y

反證法:假設f[j]>2y,則 y < f[j]/2 = (f[j-1] + f[j-2])/2 < f[j-1]

而最初的石子數是個斐波那契數,即 f[k]=x+y < f[k-1]+f[i]+…+f[j]+f[j-1] <= f[k-1]+f[i]+f[i-1] <= f[k-1]+f[k-2] <= f[k] (注意第乙個不等號是嚴格的,矛盾!)

斐波那契博弈(Fibonacci Nim)

有一堆個數為n n 2 的石子,遊戲雙方輪流取石子,規則如下 1 先手不能在第一次把所有的石子取完,至少取1顆 2 之後每次可以取的石子數至少為1,至多為對手剛取的石子數的2倍。約定取走最後乙個石子的人為贏家,求必敗態。結論 當n為fibonacci數的時候,必敗。f i 1,2,3,5,8,13,...

一種斐波那契博弈 Fibonacci Nim

事實上我也不知道這算是哪個型別的博弈 是在複習 noip 初賽的時候看到的乙個挺有趣的博弈 所以就寫出來分享一下 upd on 2018.10.12 忽然發現這個其實就是 fibonacci nim 題目 有n張紙牌,a,b兩人輪流按照以下規則取牌。規則一 a先取,但是不能在第一次將紙牌全部取完,而...

斐波那契數列 斐波那契數列python實現

斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ...