<style> .reveal .slides { text-align: left; font-size:30px; } </style> # combinatorial games ## 組合賽局 ---- ## 定義 需要滿足以下條件: 1. 遊戲有剛好兩人參與,兩人輪流做出決策,並且兩人做出的決策都是對自己最優的 2. 當有一人無法決策的時候,該人失敗。 3. 遊戲沒有平手,必然會在有限時間內結束。 4. 遊戲是公開透明的,沒有不確定或隨機的因素。 ---- # 常見賽局種類 - 標準賽局:輪到該回合,無法操作的玩家為輸 - 匱乏賽局:輪到該回合,無法操作的玩家為贏 - 無偏賽局:在同一個局面下,雙方玩家可以做的操作皆相同 - ~~有偏賽局:在同一個局面下,雙方玩家可以做的操作可能不同~~ 今天會介紹上面三種 --- ## 標準賽局 輪到該回合,無法操作的玩家為輸 ---- ## bash game 兩人玩遊戲,總共有 $N$ 顆石頭,兩個人輪流拿, 每次只能拿 1~3 顆,拿走最後一顆石頭的人獲勝 問先手贏還是後手贏? ---- ## 分析題目 1. 遊戲有剛好兩人參與,兩人輪流做出決策,並且兩人做出的決策都是對自己最優的 $\to$ 兩人玩遊戲且輪流拿,誰能拿走最後一顆石頭 2. 當有一人無法決策的時候,該人失敗。 $\to$ 拿走最後一顆之後就不能再拿了 3. 遊戲沒有平手,必然會在有限時間內結束。 $\to$ 每次都一定會少石頭,最後一定會被拿完 4. 遊戲是公開透明的,沒有不確定或隨機的因素。 $\to$ 能知道對方拿多少石頭,且沒有不確定因素 因此此題為無偏賽局 ---- ## 必勝態與必輸態 拿走最後一顆石頭的人贏,換句話說沒石頭拿的人輸 我們可以把當下剩下的石頭數量 $x$ 當成一種狀態 當 $x$ = 0 代表必輸態 而 x=0 可以由 x = 1,2,3 轉移過來 x = 1,2,3 為必勝態,因為他們可以轉移給必輸態 | 剩下石頭數量 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | ---------- | - | - | - | - | - | - | - | - | | 狀態 | -1 | 1 | 1 | 1 | ? | ? | ? | ? | ---- ## 必勝態與必輸態 狀態為必勝態與必輸態其中一種,且兩種互相相反的 玩家對於當下**所有任何操作**都能把對手轉移到**必勝態**,則當下為**必輸態** 玩家對於當下**存在一種操作**都能把對手轉移到**必輸態**,則當下為**必勝態** 白話一點, 如果玩家當下做任何操作結果都會輸,則當下為必輸態 如果玩家當下存在一種操作會讓自己贏,則當下為必勝態 ---- 回到剛剛的石頭遊戲 當剩下的石頭數量剩下 $x$ 顆時,則玩家可以把局面 變成 $x$-1, $x$-2, $x$-3 其中一種狀態 且 玩家對於當下所有任何操作都能把對手轉移到必勝態,則當下為必輸態 玩家對於當下存在一種操作都能把對手轉移到必輸態,則當下為必勝態 因此可以推出下面的表格 | 剩下石頭數量 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | | ---------- | - | - | - | - | - | - | - | - | - | - | | 狀態 | -1 | 1 | 1 | 1 | -1 | 1 | 1 | 1 | -1 | 1 | ---- 結果用數學歸納法可以得到 $$ S(n) = \begin{cases} -1, & \text{$n\mod 4 = 0$} \\ 1, & \text{otherwise} \end{cases} $$ | 剩下石頭數量 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | | ---------- | - | - | - | - | - | - | - | - | - | - | | 狀態 | -1 | 1 | 1 | 1 | -1 | 1 | 1 | 1 | -1 | 1 | 由於勝負只跟當下狀態有關,因此勝負決定的因素**只跟先後手**有關 ---- ## game graph 由於遊戲一定會在有限時間結束,因此狀態最後都會到 0 (結束) 因此會是一張有向無環圖(DAG),狀態轉移則用一條有向邊連接 ![](https://i.imgur.com/dUrTfoo.png) --- ## Nim game 有 $N$ 堆石頭,每一堆石頭有 $a_i$ 個,每次可以選其中的一堆非空的石頭堆拿至少一顆,問先手獲勝或者後手獲勝 ---- 在此遊戲中,每堆石頭都分別為獨立的子遊戲 ( sub game ) 如果把每個子遊戲的狀態都只設成先後手獲勝,則對於整個賽局沒有意義 因此要重新定義每堆石頭的狀態對於整場賽局的意義 但也必須符合前面的定義 必輸態**所有任何操作**都能把對手轉移到必勝態 必勝態**存在一種操作**都能把對手轉移到必輸態 ---- 我們可以用非負整數代表每個子遊戲的狀態 定義 0 為必輸態, 所有正整數為必勝態 而我們可以用 xor 去滿足以上性質 必輸態**所有任何操作**都能把對手轉移到必勝態 必勝態**存在一種操作**都能把對手轉移到必輸態 當 0(必輸態) xor 任何非0整數都會變成非0整數(必勝態) 任何非0數字(必勝態)都可以 xor 得到 0(必輸態) ---- ## Nim sum 回到 Nim game 假設有三堆 $5 (101_2), 8(1000_2), 22(10110_2)$ Nim sum 為每個狀態 xor 起來的結果 ($a_1$ ^ $a_2$ ^ ... ^ $a_n$) 變成 $27(11011_2)$ 而當下狀態為必勝態(非0整數),我們可以藉由 xor 之後變成必輸態$(0_2)$ 把 $22(10110_2)$ 變成 $13(1101_2)$ 如此一來整個賽局變成必輸態 (xor 後為 0) 再經由任一個操作(拿取任意顆數石頭)又可以把當前狀態變成必勝態 ---- ## Nim Game - 多個獨立的子賽局組成 - 最後結果為必輸態(Nim sum = 0) - 必勝態與必輸態是能互相轉換的 - 能由當前局面計算出先手勝/後手勝 ---- ## game graph ![](https://i.imgur.com/BTNFK4S.png) --- ## Sprague-Grundy Theorem 把無偏賽局歸納成一個 SG value 以得到結果 ---- ## n 級勝態 來看 Nim game 每個子遊戲的狀態,當某堆石頭有 $a_i$ 時, 則他可以藉由操作得到 $0$ ~ $a_i-1$ 的狀態 先定義 0 級勝態為必敗態 而如果一個狀態是 n 級勝態,則他能達到所有 i (for all i=0~n-1) 級勝態 example: 當前狀態可以達到 0,1,4,5 級勝態,則他是 2 級勝態 當前狀態可以達到 1,2,3 級勝態,則他是 0 級勝態 當前狀態可以達到 0,1,2,3 級勝態,則他是 4 級勝態 ---- 會發現要求出當前狀態的 n 級勝態, 即為求出 mex (所有可達到的狀態的集合) mex($s$) 為對於一個集合 $s$,最小未出現過的非負整數 以剛剛的例子 mex({0,1,4,5}) = 2 mex({1,2,3}) = 0 mex({0,1,2,3}) = 4 ---- 再回到 Nim game 算各自的 N 級勝態 會發現當石頭堆有 0 顆石頭,則為必敗態 而有一顆石頭,可以拿走 1 顆,而一顆石頭可以達到 0 級勝態 因此為 1 級勝態 當有 N 顆石頭時,可以達到 0 ~ N-1 的石頭數量,也就是 0 ~ N-1 級勝態 因此一堆石頭有 $a_i$ 堆時,則他為 $a_i$ 級勝態 ---- 再一個例子 ## [luogu P4860](https://www.luogu.com.cn/problem/P4860) 總共有 $n(n \le 5 \cdot 10^7)$ 個石子,兩人分別可以取 $P^k$ 顆石子 (P為任意質數 $\land k=0或1)$,沒石子拿了就輸了 問先手勝或後手勝? 轉換題目即為 $N$堆石子,每次可以能 1 顆或質數顆,問誰拿走最後一顆? ---- ## game graph ![](https://i.imgur.com/qwhpd38.png) ---- ## 表格 N = 0 為 0 級勝態 N = 1 為 1 級勝態( 轉成 0 級勝態(N = 0) N = 2 為 2 級勝態( 轉成 0 級勝態(N = 0)、轉成 1 級勝態(N = 1) N = 3 為 3 級勝態( 轉成 0 級勝態(N = 0)、1 級勝態(N = 1)、2 級勝態(N = 2) N = 4 為 0 級勝態( 轉成 1 級勝態(N = 1)、2 級勝態(N = 2)、3 級勝態(N = 3) 以此類推 | N | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | | ------ | - | - | - | - | - | - | - | - | - | - | | N級勝態 | 0 | 1 | 2 | 3 | 0 | 1 | 2 | 3 | 0 | 1 | 觀察即為當 N 整除 4 時,為必敗態 ---- 而我們把所有子遊戲的勝態 xor 起來就會是整個遊戲的 SG value 也就是我們想求出的結果 $\to$ 先手勝 or 後手勝 題目通常難度在於如何計算各個子遊戲的 SG value 通常可以透過好好觀察、通靈 ? 或者 DP 列出來 --- ## 匱乏賽局 輪到該回合,無法操作的玩家為贏 接下來一樣用 nim game 舉例 ---- 只有 $1$ 堆一顆石頭的情況 $\to$ 先手必敗 只有 $2$ 堆一顆石頭的情況 $\to$ 先手必勝 有 $k$ 堆一顆石頭的情況 $\to$ 由 $k$ 的奇偶性決定,$k$ 為奇數則先手必敗,偶數則先手必勝 ---- 而如果以下情況 1 1 1 2,可以把 2 顆石頭的那堆拿走 1 顆或 2 顆,因此可以控制輸贏 1 1 1 2 3 5 7 ... 有很多堆 > 1 顆石頭 根據數學歸納法則也最後也可以變成只有一堆 > 1 顆石頭 因此如果每堆石頭都是 1 顆,則直接判斷奇偶性 否則直接用原本標準賽局的方法(xor 每個子賽局)判斷輸贏 --- ## Practice 建議上面題目也做過一遍 [Homework Link](https://vjudge.net/contest/506062)
{"metaMigratedAt":"2023-06-16T20:32:06.252Z","metaMigratedFrom":"YAML","title":"combinatorial games","breaks":true,"description":"需要滿足以下條件:","contributors":"[{\"id\":\"19f09ccf-6b99-452f-971f-955cfc1657f3\",\"add\":5298,\"del\":589},{\"id\":\"1ec39de1-cd4b-472d-90ff-44c1c35b1f05\",\"add\":2,\"del\":2}]"}
    866 views