<style>
.reveal .slides {
text-align: left;
font-size:28px;
}
</style>
# Game
---
* 博奕論定義和簡介
* 巴什遊戲 (bash game)
* bash game + bash game --> 賽局和
* 尼姆遊戲 (NIM game)
* 博弈論的第一步 --> 轉化為game graph --> 轉化為DAG
* 圖轉SG -- SG函數
* SG外的博奕論 數感
* 例題示範
---
## 組合賽局定義
滿足至少以下條件:
1. 遊戲有剛好兩人參與,兩人輪流做出行動,並且兩人做出的行動都跟隨題目的原則(大局最佳或當回合最佳或題目特殊規則)
2. 遊戲會有結果,也就是最終會歸類到 "輸" "贏" "平手" 三種其中一種情況。
3. 遊戲是公開透明的,沒有不確定或不可控 不可知 機率 的因素。
4. 盤面資訊完全公開
----
## 博奕論簡介
* 標準 : 輪到該回合,無法操作的玩家為輸
* 匱乏 : 輪到該回合,無法操作的玩家為贏
* 或其他
----
* 無偏 : 在同一個局面下,雙方玩家可以做的操作相同
* 有偏 : 在同一個局面下,雙方玩家可以做的操作可以不同
----
## 前提
今天只會討論在 "有限時間" 內結束,也就是不會陷入無限的狀況,遊戲一定會結束。
策梅洛定理: 對於一個賽局 不論他有多複雜,只要符合page 3-1 的博奕論定義,就一定會有
1. 先手有必勝策略
2. 後手有必勝策略
3. 雙方皆有平手策略
以上三者必然有其一成立。
---
## bash game
兩人玩遊戲,總共有 $N$ 顆石頭,兩個人輪流拿,
每次只能拿 1~3 顆,拿走最後一顆石頭的人獲勝
問先手贏還是後手贏?
----
首先分析題目,可以知道他是一個 無偏 標準 賽局。
做為一個最基礎也是最廣為人知的博奕論模型(減法博奕),我們針對此遊戲去進行分析,我們若把當下石頭的數量 $x$ 當成一種狀態,當 $x == 0$ 時代表沒石頭可以拿,也就是輸了。
那由於 $0$ 會是最後一步,他的前一步會是多少呢? 分別是 $1,2,3$ 三種剩餘的狀態。
於是就可以得出結論 : 若可以讓對手操作後剩餘 $1,2,3$ 則我必贏 (因為我可以拿走剩餘全部的石頭)
----
於是就可以畫圖,然後導出 $SG-value$ 不過我們先看一下對於每種狀態的分析。
|x|win/lose|
|-|-|
|0|1|
|1|0|
|2|0|
|3|0|
|4|1|
|5|0|
|6|0|
|7|0|
|8|1|
----
那擅長dp的人會發現他每次可以轉移從 $x$ 轉移到 $x+1 , x+2 , x+3$
```cpp
bool dp[N]={};
memset(dp,-1,sizeof(dp));
for(int i=0;i<=n-3;i++){
for(int j=1;j<=3;j++){
if(dp[i]==1){
dp[i+j]=!dp[i];
}
}
}
```
----
而擅長數學,數感的人,會發現它其實就是
```cpp
int now=n%4==0?1:0;
cout<<now<<"\n";
```
----
## bash game的結論以及其衍生
bash game最後的結論
```cpp
cout<<(n%(m+1)==0)<<"\n";
```
原理就是 兩個人加起來拿滿4顆 (先手拿1顆 你就拿3顆)(先手拿2顆 你就拿2顆)(先手拿3顆 你就拿1顆)
以及其衍生,
必須對上面兩種解法都有一定的了解,才可衍生出套用在所有模型的結論。
對於畫出的每一層圖形,可以沿生出 **必勝組態** 以及 **必敗組態**
----
## 必勝組態 必敗組態
必敗組態 : $x==0 x==4 x==8$
必勝組態 : 必敗組態外的
那麼這兩個之間的關係
玩家對於當下**所有任何操作**都能把對手轉移到**必勝態**,則當下為**必輸態**
玩家對於當下**存在一種操作**都能把對手轉移到**必輸態**,則當下為**必勝態**
也就是說
如果玩家當下做任何操作結果都會輸,則當下為必輸態
如果玩家當下存在一種操作會讓自己必贏,則當下為必勝態
---
## bash game + bash game --> 賽局和
有兩堆石頭,其中一堆有 $N$ 顆,另一堆有 $M$ 顆,兩人輪流拿,每次可以拿走任意其中一堆的 $1,2,3$ 顆,沒辦法拿的人輸。請問先手還後手必勝?
----
他其實只需要直接把兩局遊戲的結果乘起來就好,你會發現它可以轉移的是
$dp(n-1,m) , dp(n-2,m) , dp(n-3,m) , dp(n,m-1) , dp(n,m-2) , dp(n,m-3)$
於是就會變成

那你就會發現,只要他的差值是4的倍數,則先手必敗。
他分別可以看成是 一場 $N$ 顆的bash game + 一場 $M$ 顆的bash game , 而把這兩場賽局的結果加起來,就是指賽局和。
----
那現在的問題就是,如果今天有一堆賽局的話 怎解? 我要做那麼多維度的dp轉移嗎?
那其根本上
每局賽局可以分成兩種型別
* N (Next player win) : 下一輪輪到的玩家(先手)獲勝。
* P (Previous player win) : 上一輪輪到的玩家(後手)獲勝。
先手勝的賽局 -> N型別
後手勝的賽局 -> P型別
----
然後就會有以下定理
定理一 : 如果 $G_1 == G_2$ 則兩個類別相同。 -- 廢話定理
定理二 : 如果 $G_2 == P$ 則 $G_1 + G_2 == G_1$ -- P完全沒用
定理三 : 如果 $G_1$ 跟 $G_2$ 都是 $P$ 則 $G_1 == G_2$
所以根據以上定理,會發現 型別為 $P$ 的賽局不論加多少個進來 都不會對原本的賽局造成影響,只要思考型別為 $N$ 的結果就好
---
## 尼姆遊戲 (NIM game)
----
有 $N$ 堆石頭,每一堆石頭有 $a_i$ 個,每次可以選其中的一堆非空的石頭堆拿至少一顆,問先手獲勝或者後手獲勝
----
也就是它是一個賽局和,分別有 $N$ 個賽局合起來的遊戲。
而我們可以用非負整數代表每個賽局的狀態
定義 $0$ 為必輸態, 所有正整數為必勝態
而我們可以用 xor 去滿足以上性質
必輸態**所有任何操作**都能把對手轉移到必勝態
必勝態**存在一種操作**都能把對手轉移到必輸態
當 $0$ (必輸態) xor 任何非 $0$ 整數都會變成非 $0$ 整數(必勝態)
任何非 $0$ 數字(必勝態)都可以 xor 得到 $0$ (必輸態)
----
而我們分析 $1 \ 2 \ 3$ 這個case,會發現他的遞迴樹應該長這樣

(normal的情況)
----
## 尼姆數
尼姆數是由每一堆石子做亦或運算 $(xor)$ 的結果,以剛剛那張圖舉例,每個殘局的尼姆數都是 $0$
,然後就可以大膽猜測尼姆數對於勝負的關西,只要輪到自己時尼姆數 $>0$ 代表必勝局,而 $=0$ 即為必敗局
以這局遊戲為例子 $\{5,6,7,8\}$ 這局的尼姆數為 $5 \ xor \ 6 \ xor \ 7 \ xor \ 8 = 12$
$nim(5,6,7,8)=5 \ xor \ 6 \ xor \ 7 \ xor \ 8 = nim(12) = 12$
也就是說先手只需要讓尼姆數變成 $0$ ,那又因為亦或運算滿足結合率,又因 $a \ xor \ a = 0$
因此$5 \ xor \ 6 \ xor \ 7 \ xor \ 8 \ xor \ 12 = 0$
----
然後會發現 $\{5,6,7,8\}$ 中, $12 \ xor \ 8$ 的結果是 $4$ , 於是我們先手要做的操作就是從 ${5,6,7,8}$ 中的 $8$ 那堆拿走 $4$ 即可。
這樣局勢會變成 $\{5,6,7,4\}$
$5 \ xor \ 6 \ xor \ 7 \ xor \ 4 = 0$
對手因為不論拿甚麼都會破壞尼姆數為0的平衡,因此對手必敗。
----
另外,由於亦或的性質,因此可以把 $\{5,6,7,8\}$ 拆成 $\{5,6\} + \{7,8\} = nim(3) + nim(15) = \{3,15\} = nim(12) = 12$
再次證明為必勝局,只要xor出來的結果是一樣的就都是相同的局面。
也就是說,一個集合為 $\{ a_1,a_2...a_N \}$ 的 Nim 遊戲
等價於一個僅有一堆數量為 $MEX( \{ a_1,a_2 ...,a_N \} )$ 的 Nim 遊戲
$\{5,6,7,8\} = \{12\}$
---
## 博弈論的第一步 --> 轉化為game graph --> 轉化為DAG
----
接下來要進入高度理論化的博奕論,把我們前面的遊戲轉化為可以套用在所有博奕的萬用模型,接下來的內容會比前面簡單的遊戲難非常多,且會重複利用到前面的理論(必勝組態,賽局和,MEX...) 做出SG
----
# 圈圈叉叉
----
## 簡易圈圈叉叉
這個賽局在一個連續的三個空白格子上遊玩。先手僅能放置叉叉,後手僅能放置圈圈,每次輪到的玩家要將符號填入一個空白的格子,盤面上出現連續兩個格子中含有自己的符號時獲勝,空白格子皆被填滿時若是沒有人獲勝,則平局。
----
小抄(畫圖在黑板上
----

----
那由於有一個最基本的條件,是賽局需要在有限時間內結束,因此一定會有起點跟終點,然後不會有無限跟迴圈的狀況,所以一定可以畫出一個DAG出來,並且建邊的條件是可以從點 $v$ 轉移到點 $u$ 即可建立一條邊。
這樣就可以更明確的知道是如何轉移的。
---
## 圖轉SG -- SG函數
----
任何標準無偏賽局,皆可以轉換成一堆 $Nim$ 遊戲
我們將這個 $Nim$ 遊戲的堆的大小,定義為 $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 級勝態
我們現在來枚舉看看 NIM game 的 勝態,即可更簡潔的知道他的做法。
(小抄畫黑板
因此一堆石頭有 $a_i$ 堆時,則他為 $a_i$ 級勝態,我們就可以回到尼姆數的結論,直接把所有石頭數xor起來即可。
----
所以我們遇到博奕論的第一步就是 想辦法轉換為NIM 然後求出SG
---
## SG外的博奕論 數感
----
找規律或者是找結論而已,通常會遇到非常明顯的規律,或者是他可以有一個結論,(奇偶性質,質數性質 之類的)
---
## 例題示範
----
本次題單的最後一題 移除壓克力板
題敘 : 桌面上有 $N$ 堆壓克力板,每堆分別有 $a_1, a_2......$a_N$ 片。Kevin 和 Nicky
打算用這些壓克力板玩一個遊戲,兩人輪流移動,每次可以從以下兩種
操作選一種:
* 選擇一堆壓克力板,並把最上面的一片拿掉。
* 選擇一堆 $2x$ 片 ($x$ 為正整數) 的壓克力板,將它整堆拿掉,並另外補上 $k$ 堆每堆 $x$ 片的壓克力板。
$N \leq 10^5 , a_i \leq 10^9 , k \leq 10^9$
----
那麼發現到每堆之間是獨立的,根據賽局和,尼姆遊戲,以及尼姆數的結論,我們只需要把每堆的SG xor 起來即為答案。
那麼SG應該要怎麼求呢?可以畫圖推出他的轉移,那我們這邊直接寫出他可以怎麼轉移。
$\left\{
\begin{array}{**lr**}
mex\{SG(x-1)\} \ \ , x \mod \ 2 = 1 \ and \ x > 0 \\
mex\{SG(x−1),SG(x/2)·(k \mod \ 2)\} \ \ , x \mod \ 2 = 0 \ and \ x > 0 \\
0 \ \ , \ x = 0
\end{array}
\right.$
----
然後畫圖找規律,分別可以找到當 $k$ 分別等於偶數和奇數的時候會有兩種結果
然後就可以求出
$\left\{
\begin{array}{**lr**}
2 \ \ , SG(x/2) = 1 \\
1 \ \ , otherwise
\end{array}
\right.$
然後就結束了。
---
## 提問以及練習時間
## [題單](https://vjudge.net/contest/593941)
我的AC-code都不長。
覺得有趣的話可以再來跟我探討:)
我有很多書可以借你:)
黑黑
{"title":"Game","contributors":"[{\"id\":\"a4015e4c-07e3-4e29-95a7-0f01997dd684\",\"add\":3,\"del\":3},{\"id\":\"19f09ccf-6b99-452f-971f-955cfc1657f3\",\"add\":3,\"del\":4},{\"id\":\"e4a3af8b-860c-46a0-96f1-558667fdcf41\",\"add\":6481,\"del\":326}]","description":"博奕論定義和簡介"}