HDU1848(SG,學習,模板)

2021-09-18 07:15:09 字數 1039 閱讀 9796

題意

今天,又乙個關於fibonacci的題目出現了,它是乙個小遊戲,定義如下:

1、  這是乙個二人遊戲;

2、  一共有3堆石子,數量分別是m, n, p個;

3、  兩人輪流走;

4、  每走一步可以選擇任意一堆石子,然後取走f個;

5、  f只能是菲波那契數列中的元素(即每次只能取1,2,3,5,8…等數量);

6、  最先取光所有石子的人為勝者;

假設雙方都使用最優策略,請判斷先手的人會贏還是後手的人會贏。

解題:遊戲和的sg函式等於各個遊戲sg函式的nim和。這樣就可以將每乙個子遊戲分而治之,從而簡化了問題。而bouton定理就是sprague-grundy定理在nim遊戲中的直接應用,因為單堆的nim遊戲 sg函式滿足 sg(x) = x。

sg函式:

首先定義mex(minimal excludant)運算,這是施加於乙個集合的運算,表示最小的不屬於這個集合的非負整數。例如mex=3、mex=0、mex{}=0。

對於任意狀態 x , 定義 sg(x) = mex(s),其中 s 是 x 後繼狀態的sg函式值的集合。如 x 有三個後繼狀態分別為 sg(a),sg(b),sg(c),那麼sg(x) = mex。 這樣 集合s 的終態必然是空集,所以sg函式的終態為 sg(x) = 0,當且僅當 x 為必敗點p時。

然後用異或判斷sg即可,如一開始有三堆,個數分別為a,b,c.則sg(a) xor sg(b) xor sg(c)==0則先手輸,否則先手勝利

#include#include#define n 1005

using namespace std;

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

void getsg(int n)

} }}int main()

return 0;

}

hdu 1848 sg博弈模版題

計算從1 n範圍內的sg值。array 儲存可以走的步數,array 0 表示可以有多少種走法 array需要從小到大排序 1.可選步數為1 m的連續整數,直接取模即可,sg x x m 1 2.可選步數為任意步,sg x x 3.可選步數為一系列不連續的數,用getsg 計算 int sg max...

HDU1848,SG函式,簡單應用示例

先理解怎麼樣用!然後再弄明白為什麼這樣用。首先定義mex minimal excludant 運算,這是施加於乙個集合的運算,表示最小的不屬於這個集合的非負整數。例如mex 3 mex 0 mex 0。對於乙個給定的有向無環圖,定義關於圖的每個頂點的sprague grundy函式g如下 g x m...

HDU 1848 博弈SG函式

題目大意 任何乙個大學生對菲波那契數列 fibonacci numbers 應該都不會陌生,它是這樣定義的 f 1 1 f 2 2 f n f n 1 f n 2 n 3 所以,1,2,3,5,8,13 就是菲波那契數列。在hdoj上有不少相關的題目,比如1005 fibonacci again就是...