尼姆博弈
问题: 给定$n$堆石子,第$i$堆数量为$a_i$,两方都采取最佳策略,问先手是否必胜?
结论: 经典尼姆游戏:当$a_1\oplus a_2\oplus…\oplus a_n\neq0$,先手必胜,否则先手必败。
证明:$x=a_1\oplus a_2\oplus…\oplus a_n$
令$x$的二进制最高位为$k$,必然存在一个数$a_i$的二进制第$k$位为$1$,且,所以$a_i\oplus x < a_i$
因为$a_i\oplus x$相较于$a_i$必然会损失一个二进制第$k$位,且$x$的二进制第$k$位是其最高位,由于$2^{k-1} > 2^{k-1}-1=2^0+2^1+…+2^{k-2}$,所以$a_i\oplus x < a_i $,所以可以在第$i$堆中拿掉$a_i-(a_i\oplus x)=2^{k-1}$个石子使得对手面对一个$a_1\oplus a_2\oplus…\oplus a_n=0$的局面。
由于异或的性质,剩余石子堆中石子数大于$0$的石子堆,对于任意一种石子数的石子堆,必然是偶数个,因此选取任何一个石子堆拿取一个石子必然会使得$a_1\oplus a_2\oplus…\oplus a_n\neq 0$。
故初始情况下有$a_1\oplus a_2\oplus…\oplus a_n\neq 0$时,先手必胜
例题:
Acwing891
尼姆博弈的扩展1——台阶尼姆博弈
问题: 给定$n$个台阶,每个台阶初始有$a_i$个石子,每次可以选择任意一级台阶拿至少一个石子放到其下一级台阶上。如可以在第$i$级台阶上选择$[1,a_i]$个石子放到第$i-1$级台阶上,第$0$级台阶就是地面。已经拿到地面上的石子不能再拿,最后无法进行操作的人视为失败。
结论: 台阶尼姆游戏:当$a_1\oplus a_3\oplus…\oplus a_{2k-1}\neq 0$,先手必胜,否则先手必败。其中$2k-1\leq n$。
证明: $x=a_1\oplus a_3\oplus…\oplus a_{2k-1}$
这里同经典尼姆游戏,当我们初始面对一个$x\neq0$的局面时,我们必然可以操作一个$a_{2k-1},(k\geq 1,2k-1\leq n)$使得后手将要面对一个$x=0$的局面。
后手有两种操作:
-
当操作奇数台阶后,先手必然面临一个$x\neq 0$的局面,同上。
-
当操作偶数台阶后,先手可以将后手将偶数台阶移动到奇数台阶的石子数,再移动到下一层偶数台阶。这样使得奇数台阶的异或和仍然为$0$。
因为偶数台阶的石子落到地面必然要经历偶数次,因此谁先操作偶数台阶,谁就仍将面对偶数台阶上无石子后只剩奇数台阶上存有石子的状态。因此本题实质上就是考虑奇数台阶上石子是如何移动的。
例题:
Acwing892
有向图的SG函数——扩展版的经典尼姆游戏
问题: 给定一个$n$个结点的有向无环图,图中$k$个节点上有棋子,两名玩家交替移动棋子。
玩家每一步可将任意一颗棋子沿一条有向边移动到另一个点,无法移动者输掉游戏。
对于给定的图和棋子初始位置,双方都会采取最优的行动,询问先手必胜还是先手必败。
结论: 设$x_1,x_2,…\ ,x_k$是$k$个初始有棋子的节点,
当$sg(x_1)\oplus sg(x_2)\oplus…\oplus sg(x^k)\neq 0$,先手必胜,否则先手必败。
证明: 先给出$sg$函数的定义:
在有向无环图中,$sg(u)$表示从节点$u$,不能到达的最小自然数。到达有向无环图的终点后,即$sg($终点$)=0$时,棋子就不能再移动了。设$sg(u)=num$,则我们可以从$u$节点转移到$[0,num)$这至少$num$个状态。
将本问题和经典尼姆游戏联系起来:
经典尼姆游戏的先手必胜是条件是初始条件下每一堆石子异或和不为$0$,设$x=a_1\oplus a_2\oplus…\oplus a_n$,先手可以在初始条件下将一个$a_i$转移到$a_i\oplus x$,使得后手总是面对$x=0$的局面,从而获胜。
即:经典尼姆游戏要求每一次操作时,操作方要选择一个石子数大于$0$的石子堆,并且至少从该石子堆中至少选择一个石子拿走,设选择的第$i$堆石子数为$a_i$,则我们可以将第$i$堆的石子数变成$[0,a_i)$。经典尼姆游戏中的$sg(a_i)=a_i$。
这与$sg$函数中状态的转移是一致的,所以我们可以将$sg$函数中的状态转移看成是一种经典尼姆游戏,求出每个初始含有棋子节点的$sg$函数,那么这$k$个$sg$函数值就可以看成进行$k$堆石子的尼姆游戏。
所以有$sg(x_1)\oplus sg(x_2)\oplus…\oplus sg(x^k)\neq 0$时,先手必胜,否则先手必败。
例题:
Acwing1319
Acwing893
扩展的SG函数——拆分尼姆博弈
由上面所述的有向图$sg$函数问题,我们可以进行扩展。
问题: 给定$n$堆石子,第$i$堆有$a_i$个石子,两位玩家轮流操作,每次操作可以取走其中的一堆石子,然后放入两堆规模更小的石子(新堆规模可以为$0$,且两个新堆的石子总数可以大于取走的那堆石子数),最后无法进行操作的人视为失败。
结论: 仍然为:$sg(a_1)\oplus sg(a_2)\oplus…\oplus sg(a_{n-1})\oplus sg(a_n)\neq 0$时,先手必胜,否则先手必败。
证明:
本题与之前的问题不同的地方在于,拆分一堆石子后,堆数会变多。
那么总体的石子拿去仍然可以看成是每个小问题,即:将拆出的石子堆单独看做先手和后手对于这个堆的独立操作。这里$a_i$在拆分中有$\frac{a_i\times(a_i+1)}{2}$种拆分情况,那么如何计算$sg(a_i)$是个问题。事实上,我们求解的$sg(a_i)$是$a_i$拆分成两个新堆的所有情况中的不能取得的最小$sg$值,这里我们认定$a_i$拆分后两个新堆分别为$b$和$c$,$sg(a_i)=mex\{sg(b,c)\}$,那么此后$sg(b,c)=sg(b)\oplus sg(c)$。
这里我们容易忽略的一点:
事实上我们在考虑之前的问题时,都可以将拿取$n$堆石子的游戏看成求解每堆石子数的$sg$函数的异或和,这是由尼姆游戏扩展而来的,但是在求解整体问题时每次我们只会关注这些数的异或和是否为$0$,从而输出游戏先手面对给定状态的输赢情况。但是每次求出的$n$堆石子数的$sg$函数异或和确实是有一个确定值的,而且不同的初始状态是不尽相同的。
这里引出一个定理:
$SG$定理: 一个游戏和的$SG$函数等于其各个子游戏的$SG$函数的异或和。
至于证明:就自己翻文献吧hh,实在是不在我的能力范围之内。
例题:
Acwing894
参考文章
SG函数与“游戏的和”
博弈论的算法总结
算法提高课,算法基础课