演算法 SG函式

2021-07-25 10:44:52 字數 808 閱讀 5737

昨天我們省的大神犇xys大佬,要跟我玩乙個小遊戲,大概是有幾個數,每次你可以選擇乙個,減去某個值,最後到誰這些數都被減成0,誰就輸。很不巧,我一眼就看穿了這是乙個先手必勝的遊戲,然後我選了先手,然後……我記錯了必勝策略,然後就在大佬的微笑中輸掉了比賽……

據說這個sg函式的證明過程比較複雜,我就大概會先寫一下,他是啥,怎麼做,就不去證明了。

我們定義必輸的局面的sg函式值為0,我們定義,sg[i]是i沒出現在i所能走到的所有狀態中,最小的自然數。

而對於局面 i j …… k 我們只要吧sg[i] sg[j] sg[k] xor 到一起,如果最後的值為0,則為必敗局面,否則為必勝局面。

這樣子 我們考慮如何求出sg函式,我們觀察發現,i所能到達的狀態顯然是i-某個值,所以我們可以從頭開始遞推,並且在區域性採取類似基數排序的方法求出sg函式

這樣子我們給出一道稍有變形的例題 hdu1536

這道題只是對減去的值做了限制,其他是一樣的。

給出ac**:

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

int n,m,k,tp,ans;

int sz[11000],c[120],sg[11000];

void sg_init()

for (int j = 0;j <= 100;j++) if (!c[j]) }}

int main()

if (ans) printf("w");else printf("l");

} printf("\n");

}}

SG函式和SG定理

大神鏈 我們先用乙個簡單的例子引入 考慮有這樣乙個遊戲,有3堆火柴,分別有a,b,c根,記為 a,b,c 每次乙個遊戲者可以從任意一堆中拿走至少一根火柴,也可以整堆拿走,但是不能從多堆火柴中拿 無法拿火柴的人輸 這個遊戲就叫做nim遊戲 舉個例子,假設a 1,b 2,c 3,若你先拿,你會怎麼辦呢?...

sg函式和sg定理

下面這篇解釋得很清楚。單個遊戲 sg 0 0 sg值為0的有且只有必敗態 sg x mex sg y x的所有後繼狀態中 第乙個不能達到的sg值,則x可到達sg為0 sg x 1的狀態 組合遊戲 可將sg值看作為石子數,則轉化為nim取石子遊戲,總遊戲的勝負由sg的異或和決定。hdu1848 1 i...

freopen函式 SG函式與SG定理

sg函式是用來解決acm競賽中公平組合遊戲問題的利器 在介紹sg函式和sg定理之前我們先介紹介紹必勝點與必敗點.必勝點和必敗點的概念 p點 必敗點,換而言之,就是誰處於此位置,則在雙方操作正確的情況下必敗。n點 必勝點,處於此情況下,雙方操作均正確的情況下必勝。必勝點和必敗點的性質 1 所有終結點是...