hdu2516斐波那契博弈

2022-03-16 01:15:28 字數 2472 閱讀 6206

剛開始想用sg函式做,想了半天沒一點思路啊。

原來這是乙個新題型,斐波那契博弈

斐波那契博弈模型:

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

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

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

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

n = 2時輸出second;     

n = 3時也是輸出second; 

n = 4時,第乙個人想獲勝就必須先拿1個,這時剩餘的石子數為3,此時無論第二個人如何取,第乙個人都能贏,輸出first; 

n = 5時,first不可能獲勝,因為他取2時,second直接取掉剩下的3個就會獲勝,當他取1時,這樣就變成了n為4的情形,所以輸出的是second;   

n = 6時,first只要去掉1個,就可以讓局勢變成n為5的情形,所以輸出的是first;      

n = 7時,first取掉2個,局勢變成n為5的情形,故first贏,所以輸出的是first;     

n = 8時,當first取1的時候,局勢變為7的情形,第二個人可贏,first取2的時候,局勢變成n為6得到情形,也是第二個人贏,取3的時候,second直接取掉剩下的5個,所以n = 8時,輸出的是second;    

…………      

從上面的分析可以看出,n為2、3、5、8時,這些都是輸出second,即必敗點,仔細的人會發現這些滿足斐波那契數的規律,可以推斷13也是乙個必敗點。     

借助「zeckendorf定理」(齊肯多夫定理):任何正整數可以表示為若干個不連續的fibonacci數之和。n=12時,只要誰能使石子剩下8且此次取子沒超過3就能獲勝。因此可以把12看成8+4,把8看成乙個站,等價與對4進行"氣喘操作"。又如13,13=8+5,5本來就是必敗態,得出13也是必敗態。也就是說,只要是斐波那契數,都是必敗點。

所以我們可以利用斐波那契數的公式:fib[i] = fib[i-1] + fib[i-2],只要n是斐波那契數就輸出second

證明**:

為了方便,我們將n記為f[i]。

1、當i=2時,先手只能取1顆,顯然必敗,結論成立。

2、假設當i<=k時,結論成立。

則當i=k+1時,f[i] = f[k]+f[k-1]。

則我們可以把這一堆石子看成兩堆,簡稱k堆和k-1堆。

(一定可以看成兩堆,因為假如先手第一次取的石子數大於或等於f[k-1],則後手可以直接取完f[k],因為f[k] < 2*f[k-1])

對於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^31 = 2 147 483 648,這個超過int範圍了,所以用long long,fib到第46項即可

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define pi acos(-1)

#define ll long long

#define mod 1000000007

#define ls l,m,rt<<1

#define rs m+1,r,rt<<1|1

#pragma comment(linker, "/stack:1024000000,1024000000")

using

namespace

std;

const

double g=10.0,eps=1e-9

;const

int n=1000+10,maxn=111117,inf=11111

;int

f[n],sg[n],hash[n];

void getsg(int

n) }

}int

main()

if(flag)cout<

second win

"<

else cout<

first win

"<

}return0;

}

view code

hdu 2516 斐波那契博弈)

思路 網上大牛說是著名的斐波那契博弈模型 首先 2個石頭肯定是必敗點,3個石頭也是必敗點,然後開始看後面,4個石頭時,可以去乙個使對手到必敗點,而對手在這種情況下在必敗點是不能贏得,所以4是必勝點。但是後面5個石頭的情況就不同了,因為5個石頭 你肯定不會sb的走到4這個必勝點讓對手贏,但是你發現走到...

hdu 2516 斐波那契博弈)

思路 網上大牛說是著名的斐波那契博弈模型 首先 2個石頭肯定是必敗點,3個石頭也是必敗點,然後開始看後面,4個石頭時,可以去乙個使對手到必敗點,而對手在這種情況下在必敗點是不能贏得,所以4是必勝點。但是後面5個石頭的情況就不同了,因為5個石頭 你肯定不會sb的走到4這個必勝點讓對手贏,但是你發現走到...

hdu 2516 博弈。斐波那契數

1堆石子有n個,兩人輪流取.先取者第1次可以取任意多個,但不能全部取完.以後每次取的石子數不能超過上次取子數的2倍。取完者勝.先取者負輸出 second win 先取者勝輸出 first win input 輸入有多組.每組第1行是2 n 2 31.n 0退出.output 先取者負輸出 secon...