hdu 2516 取石子遊戲

2021-06-18 06:40:35 字數 821 閱讀 7640

題目:hdu 2516 取石子遊戲

思路:fibonacci nim

列舉前幾項,發現2,3,5是必敗態,不能說明什麼。對於當前的狀態,第一次不能全部取完,其餘的每次取的時候,不能超過前者上一次的兩倍。

對於當前狀態n,最多能取的是 ceil(n/3)-1 和 前一狀態取的的兩倍 兩者間的最小值。

然後這裡有個齊肯多夫定理:任何乙個正整數都可以表示成若干個不連續斐波那契項的和。

若是當前狀態時斐波那契項會怎麼樣,分析一下斐波那契項,f(n)=f(n-1)+f(n-2)=2*f(n-2)+f(n-3)<=2*f(n-2)+f(n-2)-1  所以ceil(f(n)/3)-1 < =f(n-2)-1 

如果對手取f(n-2)-1 剩下 f(n)-f(n-2)+1=f(n-1)+1 或者取其他的,都不會讓剩下的是非波納契項。

也就是說,在保證取得數字大小在範圍之內的前提下,我們可以控制對手的狀態一直是斐波那契項,已知前幾項2,3,5是必敗態,可以推導一下,發現斐波那契項均是必敗態。

對於不是斐波那契數列的,根據齊肯多夫定理,可以表示成若干不連續斐波那契項的和,那麼不管對手怎麼取,我們要做的就是取若干石子,使剩下的狀態呈現為乙個非波納契項。

具體證明請看這裡:

#include #include #include #include #include #include #include using namespace std;

sets;

int main()

int n;

while(scanf("%d",&n),n)

return 0;

}

hdu2516 取石子遊戲

題目大意 桌子上有若干個石子,兩人輪流取。每次必須取走乙個,但不得超過前面的那個人取的數的2倍。拿到最後乙個石子的贏得遊戲。首先,這是一道博弈題,毋庸置疑,找到必敗點,這道題就會有突破 1,2,3是不可否人的必敗點 對於4,先手先取走1個的話,後手就不能取3個,所以還剩下3個,3是必敗點,所以4就是...

hdu2516 取石子遊戲

思路 找規律。先寫個暴力程式,然後發現凡是斐波那契數,都是後手贏,否則先手贏。我也不知道為什麼。暴力程式在 中被注釋。include include include include include include include include include include include inc...

hdu 2516 取石子遊戲

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