博弈论
定义
-
必胜或必胜状态:仅仅考虑当前的状态,不考虑的操作人时,一定必胜或必输
-
\(a\oplus b\) :\(a,b\) 在二进制下,对位取反。
-
\[SG(i)=mex{\begin{cases} SG(j) & i\rightarrow j \\ SG(j') & i\rightarrow j' \\ \dots \end{cases}} \]
其中 \(i\rightarrow j\) 表示 \(i\) 有一条边指向 \(j\) ,\(mex\) 指一个数列第一个未出现的非负数
Nim 游戏
考虑有 \(n\) 堆石子,两个人轮流来拿走棋子(至少拿一个),拿到最后剩下的一颗棋子的人获胜。
结论:
定义 Nim 和 \(= a_1\oplus a_2\oplus a_3\oplus\dots\oplus a_n\)。
当 Nim 和 为 \(0\) 时,该状态为必败状态;反之,则为必胜状态。
证明:
我们需要三个引理:
-
无后继状态为必败状态
这个情况只有全 \(0\),同时满足 \(a_1\oplus a_2\oplus\dots\oplus a_n=0\) 。
-
对于当前状态 \(a_1\oplus a_2\oplus\dots\oplus a_n\ne0\),一定存在某种移动使得其异或和为 \(0\)
考虑来构造一下:
设 \(a_1\oplus a_2\oplus\dots\oplus a_n=s\),同时设 \(s\) 的在二进制下,最高位为 \(k\) 。
如果我们想使 \(s\) 变为 \(0\),就非常想两边同时乘 \(s\) 。
但是每次进行一次拿石子必须需要时某个 \(a_i\) 减少,
所以可以考虑在 \(a_i\) 处拿,则需要证明 \(a_i\oplus s<a_i\) 的。
现在来想一想异或的定义,发现 \(s\) 最高位为 \(1\) ,则在 \(a_1,a_2\dots,a_n\) 肯定有一个 \(t\) ,使得 \(a_t\) 这一位也是 \(1\)
那就拿 \(a_t\oplus s\) ,我们又发现最高位变成了 \(0\) 。
由于这是最高位,则 \(a_t\) 比 \(k\) 还高的位就不会改变,所以 \(a_t\oplus s\) 一定 \(<a_t\) 。
于是就构造出来一组解了。
-
对于当前状态 \(a_1\oplus a_2\oplus\dots\oplus a_n=0\),一定不存在某种移动使得其异或和为 \(0\)
也就是说,只要有一个 \(a\) 数组中数的位发生改变,那么其异或和就不为零了。
SG 函数
在一个有向无环图中,只有一个起点,上面有一颗棋子,两个玩家轮流来移动这颗棋子(必须移动),最先不能移动棋子的人算输。
\(SG(i)\) 那就表示当前在点 \(i\) 状态(为零必输,非零必赢)
SG 定理
有 \(n\) 个有向图游戏组成的组合游戏,设起点分别为 \(s_1,s_2,\dots,s_n\)
则当 \(SG(s_1)\bigoplus SG(s_2)\bigoplus \dots\bigoplus SG(s_n)\ne 0\) 时,则游戏先手必赢
同时,这是该游戏状态 \(x\) 的 SG 值。
证明:
-
从 \(SG(i)\) 转移到 \(SG(j)=SG(i)\)
这显然是不可能的,看一会SG 函数的定义就会明白。
-
从 \(SG(i)\) 转移到 \(SG(j)>SG(i)\)
那对手就可以移回与 \(SG(i)\) 相等的点,那就无意义了。
-
从 \(SG(i)\) 转移到 \(SG(j)<SG(i)\)
其实,可以将其抽象成取石子,那就可以使用 Nim 和(即异或和)来求解