剛開始想用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#includeview code#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;
}
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...