学习笔记 【SG函数】
学习笔记 SG函数
博弈论补的太晚了。
定义
对于一种公平博弈游戏(博弈状态的先后关系可构成一个拓扑图),构造 \(SG(x)\) 函数为博弈状态为 \(x\) 时的一个非负整数值,我们给定其一个值,由下列公式得到:
以及一个重要的性质(\(SG\) 定理):后手能赢,当且仅当 \(\bigoplus_{u\in \texttt U} SG(u)=0\),否则先手赢。
其中 \(v\) 是 \(u\) 可以一步得到的子博弈状态,\(\texttt V\) 是终局,\(\texttt U\) 是起始状态,\(\texttt{mex}\) 指的是集合中第一个未出现的非负整数。
注意这里的多个 \(SG(u)\) 代表的可能是多个子博弈游戏,例如经典 \(nim\) 取石子游戏多个石子堆对应的就是多个 \(SG(u)\)。
证明
我们先只讨论起始状态异或和等于 \(0\) 的情况。
因为终局情况一定是多个子博弈游戏都到了 \(SG(v)\) ,此时显然 \(\bigoplus SG(v)=0\) 满足定理。
所以我们只要证明在任何情况下,不管先手如何走,后手都可以走一步使得异或和等于0。
当一个子博弈游戏被先手从 \(SG(u)\) 到了 \(SG(v)\) 出现两种情况,证明如下:
-
\(SG(v)>SG(u)\)
因为 \(v\) 的 \(SG\) 值较大,所以 \(v\) 的子博弈状态一定有一个值为 \(SG(u)\) 此时先手走向值为 \(SG(u)\) 的子博弈状态状态即可。
-
\(SG(v)<SG(u)\)
有点麻烦。。。
令 \(SG(u)\) 为 \(a\),\(SG(v)\) 为 \(b\),原本的状态是 \(a\oplus a=0\) ,然而现在变成了 \(a\oplus b\) ,所以我们只要找到其它博弈状态的 \(SG\) 函数中有一个数 \(c\),将 \(c\) 变成 \(c\oplus a\oplus b\),此时原始就变成了 \(a\oplus(a\oplus b)\oplus b=b\oplus b=0\)。
因此只要保证 \(c\oplus a\oplus b\) 一定要小于 \(c\),问题就变成证明这个 \(c\) 必定存在。
(\(x_i\) 表示 \(x\) 的二进制第 \(i\) 位)
我们再令 \(a\) 和 \(b\) 最高的不相同的二进制位为 \(i\)。
- 若 \(a_i=1\),那么因为原来除 \(SG(u)\) 外的 \(SG\) 函数异或起来是 \(a\),所以必然有一个 \(SG\) 函数值为 \(c\),满足 \(c_i=1\),此时 \(a\oplus b\) 的最高非 \(0\) 位就是 \(i\),那么显然有 \(c\oplus a\oplus b\) 小于 \(c\)。
若 \(a_i=0\),那么 \(i\) 必然不是 \(a\) 的最高非位,而其它 \(SG\) 函数必然有一个 \(c\),它的最高非 \(0\) 位和 \(a\) 相同,此时 \(c\oplus a\oplus b\) 最高非 \(0\) 位是低于 \(c\) 的最高非 \(0\) 位。
upd 2021/05/25 :
发现假了,第二种情况根本不可能,因为 \(b < a\),所以 \(a\) 和 \(b\) 的最高不相同的位一定是 \(a_i = 1 \& b_i = 0\)。
如果开始博弈状态异或和不为 \(0\),那么先手显然可以走一步使异或和等于 \(0\),和上述的方法一样。
例题
这种东西一找一大片吧。。。
实际为了掩盖咕咕咕