sg函式
const int maxn = 600000;
int n;
int sg[maxn];
int sg(int x) ;
// 這裡寫遞迴到後繼狀態
for(int i = 2; i < x; ++i)
}int res = -1;
for(int i = 0; i < 32; ++i)
}assert(res >= 0);
return sg[x] = res;
}
有 \(n\) 堆石子,分別有 \(a_1,a_2,\cdots ,a_n\) 個,每次從一堆石子取 \([1,\infty]\) 個,不能操作的人輸。
異或和為0時,先手必敗,其餘情況先手必勝。
若異或和為x,且x不為0,設x的二進位制最高位為第k位,那麼至少存在1堆石子ai其數量的第k位為1,易知ai xor x < ai,故可以從這堆石子中轉移到異或為0的狀態。
反之,假如當前異或和為0,那麼無論怎麼取,下一步異或和必定是非0值。
所以當異或和為0時,無論先手做什麼,後手都能維持異或和為0的狀態轉移回來,直到勝利。反之先手可以把局面變成異或和為0的狀態轉移給後手。
總結:一堆石子的sg函式為 \(sg[n]=n\) 。
有一堆石子,有 \(n\) 個,每次從一堆石子取 \([1,m]\) 個,不能操作的人輸。
剩餘石子為[1,m]時,顯然是先手必勝,必勝策略是全取。
剩餘石子為m+1時,是先手必敗,無論第一步如何操作第二步都可以全取。
那麼從[m+1+1,m+1+m]都是先手必勝,因為可以一步取到先手必敗態。
故剩餘石子為k(m+1)時,先手都是必敗的,因為無論第一步先手取什麼,後手都可以保持石子數為m+1的倍數。
總結:先手必勝當且僅當n不是m+1的倍數。一堆石子的sg函式為 \(sg[n]=n (\mod m+1)\) ,當有若干堆石子時,考慮sg函式。
雙方均直到場上的所有資訊,雙方每一步能做的事情和當前輪是誰無關,同一局面不可多次到達,有限步內會結束,沒有平局,無法行動的人輸。多個公平組合遊戲合起來也是乙個公平組合遊戲。
把公平組合遊戲的每個狀態看作節點,合法的決策是轉移邊,那麼乙個公平組合遊戲就是乙個dag,出邊為0的點(無法移動的點)是必敗點,由於這是乙個dag所以可以通過dp求出所有的狀態的勝負性。然後可以規定出sg函式:乙個點的sg函式值為其後繼點的sg值的集合的mex。
顯然的結論:必敗點的sg值為0,經過一次轉移之後sg值必定改變,sg值不為0的點都是必勝點,因為其後繼狀態一定有乙個是sg值為0的點。
不知道怎麼證明的sg定理:若干個公平組合遊戲的sg值,是他們乙個乙個的sg值的異或和。
使用sg定理解決的思路:觀察哪個是乙個單獨的最小的公平組合遊戲,對這個遊戲進行打表,然後強行看出sg函式的規律。
有n堆石子,分別是a1,a2,...an個,每次從[1,k]堆石子取任意正數個,不能操作的人輸。(nim遊戲是k=1的特殊形式)
當且僅當任意的k都有 \(k+1|\frac^n (2^k&a_i)}\) 時先手必敗,其餘情況先手必勝。
首先不能操作的一方獲勝。
必勝:sg函式非0且至少一堆石子數大於1,或sg函式為0且任意一堆石子數小於等於1。
sg遊戲中,首先不能操作的一方獲勝。
必勝:sg函式非0且至少乙個遊戲的sg函式大於1,或sg函式為0且任意乙個遊戲的sg函式小於等於1。
起點有一顆棋子,轉移圖是乙個二分圖,當起點在所有二分圖的最大匹配中時,先手必勝。否則先手必敗。
模板 數學 博弈論
1.要從必勝或必敗的局面反推 2.sg函式 只要當前狀態可以轉移到的狀態中有乙個是敗態,那麼當前狀態就是勝態。勝態為n。如果當前狀態可以轉移到的所有狀態都是勝態,那麼當前狀態就是敗態。敗態為p。sg函式為每個狀態賦乙個自然數的值,這個值為除這個狀態的後繼外的最小自然數。首先定義mex minimal...
模板 數學 博弈論 SG函式
f i 表示狀態i的後繼狀態,把它的後繼狀態push back 進去,然後呼叫getsg 就可以得到sg函式。無法轉移的狀態都是失敗狀態,這種寫法貌似只能向標號更小的狀態轉移 本身這個圖就是dag,就有拓撲序,所以本質上無所謂,更何況取石子非常直觀 所以一般f 0 就是失敗狀態。當然也可能會有別的失...
小樂樂學博弈
小樂樂和小皮蛋開始學習關於博弈的知識。給定兩堆石子,第一堆有n個石子,第二堆有m個石子。每次操作可以從一堆石子中拿走一些石子,拿走石子的數量可以是1 k個,小樂樂先手拿石子,然後依次輪流。假如到小樂樂的輪次,小樂樂拿不了了 也就是所有的石子都被拿光了 那麼小皮蛋就獲勝,反之亦然。假設小樂樂和小皮蛋都...