博弈论学习笔记

· · 算法·理论

基础

博弈论一般是两个人玩某些游戏,问谁一定能赢。

对于游戏中的每个状态,分别有必胜手和必败手。

必胜手存在一个后继为必败手,必败手全部后继均为必胜手。

SG函数

Nim游戏

问题描述

模版链接

给定 n 堆石子,两人轮流取一堆中的至少一个,不能操作者输。

解法

\bigoplus_{i=1}^{n}a_i=0 时先手必败,否则先手必胜。

证明

设所有 a_i 异或和为 S

观察结束状态,会发现 S=0

如果可以证明 S\ne0 的状态一定可以通过操作使 S=0,且 S=0 无论如何操作都会使 S\ne0,则可以证明结论正确。

S=0 时一定会在操作后使 S\ne 0,因为至少要取出一个石子。

下证 S\ne 0 时一定可以操作使 S=0

S 二进制的最高位是 k

那么存在一个 a_i 满足二进制上第 k 位是 1,我们设其为 p

可以得到 S\oplus p<p

因为二者大于 k 的位数均相等,且第 k 位上左侧为 0,右侧为 1

那么只要在 p 所在的那堆中取走 S\oplus p 个,便会有 S\oplus p\oplus (S\oplus p)=0

证明思路

设拿走的那堆原来有 x 个,剩下了 y 个,则我们希望 S\oplus x\oplus y=0

也就是说 y=S\oplus x

只需证 S\oplus x<x 即可,之后便有取走其最高位的思路,得证。

SG函数

对于结束态 T,如果其为必败点,SG(T)=0,否则 SG(T)=1

那么当 $SG(S)$ 为 $0$ 时,当前点为必输点,否则当前点为必胜点。 原因:根据 $mex$ 的定义,可知当 $SG(S)$ 为 $0$ 时,其所有后继均有 $SG(S')\ne 0$。而 $SG(S)$ 不为 $0$ 时,其一定有后继 $SG(S')=0$。 此时有疑问,为什么 $SG$ 的定义如此之怪,表示必胜点与必败点关系的方式还有很多。 这是因为,按照如上方式的定义下,$SG$ 函数有一个很好的性质 $SG(S)$ 存在后继 $SG(S')=[0,SG(S)-1]$。 之后,便可以得到一个很好的性质:多个游戏的 $SG$ 值为所有游戏 $SG$ 值的异或和。 证明与 Nim 游戏的证明类似,可以视为任意一个子游戏相当于一堆石子,而取石子相当于转移到其后继。 $SG$ 函数本质上其实相当于把所有的博弈论问题均转换成了 Nim 游戏,它的定义既符合博弈论的性质又有着 Nim 所需要的性质,是非常好的关于博弈论问题上的工具。 # 经典模型 ## 阶梯 Nim 有一个楼梯,每个台阶上有石子,两个人依次把台阶上的石子往下移,如果是第一阶就扔掉,不能操作者输。Alice 先 Bob 后。 ### 解法 只保留奇数阶的石子数量做 Nim 游戏。 ### 证明 先手只需要维护所有编号为奇数的台阶异或和为 $0$ 即可。 - 如果后手操作了奇数,先手需采取和普通 Nim 相同的方式维护异或和为 $0$。 - 如果后手操作了偶数,先手只需把后手从偶数移到奇数的部分移回偶数即可。 大概就是,可以通过操作使从偶移到奇的操作无效,那么便只需要关心奇到偶的操作,而移到偶可以视为直接扔掉。 ## 树上 Nim 给定一棵树,节点上有石子,两个人依次把某一节点上的石子移到其父亲节点。 ### 解法 与阶梯类似,只保留奇数层,证明也同理。 ## Bash 博弈 有 $n$ 堆石头,A 和 B 轮流取。 每次从任意一堆取出至少一个石头,至多 $m$ 个,不能取的输。 ### 解法 堆数向 $m+1$ 取模之后做 Nim。 ### 证明 可以从两个角度来证明。 #### 策略性方法证明 假设某次操作从大小为 $k$ 的石子堆里取走了 $x$ 个石子。 如果 $k\le m+1$,可以通过再取 $m+1-x$ 个石子保持其模 $m+1$ 之后的值不变。 如果 $k<m+1$,按照一般 Nim 方式操作即可。 #### SG 函数证明 观察此规则下的单堆石子的 $SG$ 函数有什么特点。 剩 $x$ 个石子的前驱为 $max(0,x-m)\sim x-1$,打表: ``` 0 1 2 3 4 5 ... m 0 1 2 ... m-1 m 0 1 ... 0 1 2 3 4 5 ... m m+1 m+2 m+3 ... 2m 2m+1 2m+2 2m+3 ... ``` 或者考虑其意义,均可得到上述结论。 ## Nimk游戏 同 Nim 游戏,但是每次可以从至多 $k$ 堆中取出。 ### 解法 普通 Nim 的异或可以视为在二进制下每一位做模 $2$ 意义下加法。 那么 Nimk 便是二进制每一位做模 $k+1$ 意义下做加法。结果为 $0$ 则先手必败,否则先手必胜。 ### 证明 主要证明如何操作 $k$ 个数使结果为 $0$。 首先,还是考虑 $S$,即 $n$ 二进制每一位做模 $k+1$ 意义下做加法的结果,不为 $0$ 的最高位,假设这一位上的数为 $m$,这一位是 $p$。 显然有 $m\le k$。 可以找到 $m$ 个数使得对这些数取走 $2^p$ 后可以使这一位变成 $0$。 又因为 $p$ 是最高位,所以每个数取走 $2^p$ 后可以通过归还部分石子使得低于 $p$ 的位数也变成 $0$。 得证。 ## Anti-Nim 同 Nim 游戏,但是不能操作者胜。 ### 解法 以下两种情况先手必胜: - 异或和不为 $0$ 且存在石子堆数量大于 $1$。 - 所有石子堆数量均为 $1$ 且总共有偶数堆。 分三种情况讨论。 1. 不存在石子堆数量大于 $1$:偶数先手胜,奇数后手胜。 2. 只有一堆石子数量大于 $1$: - 如果此时数量为 $1$ 的石子有奇数堆,则全部取走,以达成情况 $1$。 - 反之,则取到剩下一个,也会达成情况 $1$。 3. 有多堆石子数量大于 $1$:因为情况 $2$ 的异或和一定不为 $0$ 所以当异或和不为 $0$ 时先手一定能得到情况 $2$ 的局面,从而必胜。 此结论也可在 $SG$ 函数上进行推广。 [题目链接](https://www.luogu.com.cn/problem/P4279) ## AGC017D 有一棵 $n$ 个节点的树。Alice 和 Bob 两人轮流操作,Alice 先手:每次删去图上一条边,然后把不包含 $1$ 号点的联通块删除,不能操作者输。 ### 解法 定义 $SG(x)$ 表示以 $x$ 为根的子树的 $SG$ 值。 于是便有 $SG(u)=\bigoplus_{v\in son_u} (SG(v)+1)$。 首先 $SG(x)+1$ 其实相当于一颗树加了一条边的结果。 因为对于 $SG(x)$ 及其所有后继状态,它们都多了一个直接把这条边割掉的后继状态,也就是说都多了一个 $0$ 的后继,于是所有 $SG$ 均会加一。 之后再把它们异或起来即可。 ## 1-动态减法游戏 有一个整数 $n$,双方轮流令它减去一个正整数值。第一次不能减完,之后每次减的数不超过上一次,把它减到 $0$ 者胜利。 ### 解法 当 $n$ 为 $2^k$ 时,先手必败,否则先手必胜。 先手的策略为一直取当前数的 lowbit,即 $2^{二进制为1的最低位}$。 ### 证明 设 $n$ 的二进制为 $1$ 的最低位为 $k$。 假设 $n=p\times 2^k$,可以发现,$p$ 为奇数,$p-1$ 为偶数。 那么就会有后手无论如何取,$p$ 一定会变回奇数。 如果后手也取了 $2^k$,$p$ 变成奇数。 如果后手不取 $2^k$,lowbit 一定会减小,同时 $p$ 也会变成对应的一个奇数。 那么就一定不会有后手取完后数变成 $0$ 的情况,从而先手必胜。 而 $n=2^k$ 时,由于规则限制,先手便不能取 lowbit。同时,无论先手如何取,后手一定可以取操作之后的lowbit,此时先后手反转,后手必胜。 ## 2-动态减法游戏 有一个整数 $n$,双方轮流令它减去一个正整数值。第一次不能减完,之后每次减的数不超过上一次的两倍,把它减到 $0$ 者胜利。 ### 解法 当 $n$ 为斐波那契数时,后手必胜,否则先手必胜。 ### 证明 首先对于任意数 $x$,它一定可以被分解成若干个不相邻的斐波那契数之和。(相邻的数可以合成一个更大的数) 先手的策略为每次取当前数斐波那契分解后的最小数,设这个数为 $f_x$。 因为有 $2f_i<f_{i+2}$,于是后手每次操作都不能取到大于等于 $f_{x+2}$ 的数。 之后过程类似 1-动态减法游戏,可得先手必胜。 ## k-动态减法游戏 题目同上。 ### 解法+证明 参考上两问,我们希望构造一个序列,满足任意数在该序列下有唯一分解:$a_i$,并满足 $\frac{a_{i+1}}{a_i}>k$。 根据此结论,可以对序列进行构造。 具体的,设 $a_i$ 为构造的序列,$b_i$ 为 $1\sim i$ 可以表示出的最大数。 如果当前已经构造了 $1\sim k$,那么有 $a_{k+1}=b_k+1$,$b_{k+1}=a_{i+1}+b_t$。其中,$t$ 表示满足 $\frac{a_{i+1}}{a_t}>k$ 的最大的 $t$。 解释:为保证 $a$ 可以表达出所有数,所以 $a_{k+1}$ 应该是当前最小的不能表达的数:$b_k+1$,而拆分后的序列必须满足相邻两项相除大于 $k$,那么能表示出的数只能由 $a_{k+1}$ 前面接上 $a_t$ 及之前的数,也就相当于 $b_t+a_{k+1}$。 观察到当 $k=1$ 时 $a_i$ 呈指数级增加,而 $k$ 更大只会使增长速度增加。 于是 $t$ 可以暴力求出。 [题目链接](https://acm.hdu.edu.cn/showproblem.php?pid=2486) ## Nim 积 Alice 和 Bob 玩游戏。在一个二维平面中,有 $n$ 个灯亮着并告诉你坐标,每回合需要找到一 个矩形,这个矩形 $(x, y)$ 坐标最大的那个角落的点必须是亮着的灯,把四个角落的灯状态反转,不能操作为败。 ### 解法 重新考虑 Nim 的本质。 如果在一个 $SG$ 为 $x$ 的状态中加入一个 $y$ 的石子堆,当前状态则变为 $x\oplus y$。 而这个状态又可以长成这样:$x\oplus y=\operatorname {mex}\{ a\in [0,x),a\oplus y \bigcup b\in[0,y),b\oplus x\}

具体的,可以选择 x 取到 ay 不变,即 a\oplus y,也可以选择 y 取到 bx 不变,即 b\oplus x

根据 SG 函数的定义,这些后继状态的 \rm mex 即当前状态的 SG

那么根据上述,定义 Nim积 运算为:

x\otimes y=\operatorname {mex}\{a\in [0,x),b\in[0,y),(a\otimes x)\oplus(b \otimes y)\oplus(a\otimes b)\}

其中 x\otimes y 表示 (x,y) 亮着的 SG 值,而它的前驱即是 (a\otimes x)\oplus(b \otimes y)\oplus(a\otimes b)

他满足交换律,结合律,分配率,不会证。

x\otimes y=y\otimes x\\ (x\otimes y)\otimes z= x\otimes (y\otimes z)\\ x\otimes (y\oplus z)=(x\otimes y)\oplus (x\otimes z)

可以发现去掉圈之后,运算法则与普通运算类似。

特别的,有

0\otimes a=a\otimes 0=0\\ 1\otimes a=a\otimes 1=a

也就是说,01 在 Nim 积运算中起到了零元和单位元的作用。

考虑如何计算这个东西。

首先有 O(n^2) 的暴力,但这十分低劣,需要继续考虑。

根据数学家长久以来的寻找,发现了称之为费马数的神奇性质。

一个费马数 p=2^{2^k},计算 Nim 积时有:

根据这个可以得到一个 O(\log^2) 的计算方法。

f(x,y)=x\otimes y,g(x,y)=2^x\otimes 2^y

f(x,y)=\oplus_{x'\in x,y'\in y}g(x',y')

考虑计算 g(x,y),可以从高位往低位依次处理。

假设现在处理到了第 k 位。

把递归过程写出来可以得到:

g(x,y)=(\oplus _{i\in {x \operatorname{xor} y}} 2^{2^i})\otimes (\otimes _{i\in{x\operatorname{and}y}}\frac{3}{2}2^{2^i})

前半部分根据费马数的性质可以直接算乘积,后半部分因为乘了 \frac{3}{2} 所以不好处理,考虑递归。

记忆化之后可以做到 O(\log^2)

int n,m,k,a[MAXN],t[MAXN][MAXN];
int f(int x,int y);
int g(int x,int y){
    if(!x||!y)return 1<<(x|y);
    if(~t[x][y])return t[x][y];
    int res=1;
    for(int i=0;i<=N;i++)if((1ll<<i)&(x^y))res<<=1ll<<i;
    for(int i=0;i<=N;i++)if((1ll<<i)&(x&y))res=f(res,3ll<<((1ll<<i)-1));
    return t[x][y]=t[y][x]=res;
}
int f(int x,int y){
    if(!x||!y)return x|y;
    if(x==1||y==1)return x^y^1;
    int res=0;
    for(int i=0;i<=N;i++)if((1ll<<i)&x)for(int j=0;j<=N;j++)if((1ll<<j)&y)res^=g(i,j);
    return res;
}

三维 Nim 积

上述问题换成三维。

解法

三个数积起来即可。

博弈论相关题目

CF1704F Colouring Game

题目大意

Alice 和 Bob 在玩游戏。有 n 个格子排成一行,每个格子被涂成了红色或蓝色。 Alice 每次操作选择两个相邻的格子,要求其中至少有一个是红色,然后把这两个格子涂成白色。 Bob 每次操作选择两个相邻的格子,要求其中至少有一个是蓝色,然后把这两个格子涂成白色。 他们轮流进行操作(Alice 先手),不能操作的人就输了。 现在给定初始局面,请问在他们都足够聪明的前提下,谁会获得胜利?

题解

博弈论题目,可以先考虑其规则有哪些性质,玩家的策略是怎样的。

对于此题,就考虑,如果我是 Alice,我的策略是什么。

我希望尽可能多的操作,也就是说,我希望我的操作次数尽量多。对应的,我希望对方的操作次数尽量少。

观察题目,发现对于两人而言,每次操作一定会减少至少一个自己代表色的颜色块,同时颜色块数量不会增加。

那么为了尽可能增加我的操作次数,减少对方的操作次数,我应该优先取走形如 RBBR 的颜色块。

对应的,对方的策略也相同。也就是说,Alice 和 Bob 在场上存在 RBBR 块时,一定优先取这些块。

那么当场上不存在这些块时怎么办?

此时,因为场上不存在 RBBR,那么每个连续非白颜色块将只有一种颜色。

任何人都无法减少对方的操作次数,只能增加自己的操作次数。

那么此时的策略应该是从两侧开始取,每次操作一个颜色块和一个白块。

于是,每个人的操作次数便是剩余的自己代表色色块数量。

假设某个时刻,场上已经不存在 RBBR,此时有 xRyB

也就是说,当 x\ne y 时,获胜方是不由谁是先手而决定的。

同时,注意到每次取走一个 RBBR 段时,RB 的差并不会改变。综上可以得到,当场上 RB 数量不相等时,胜者已经确定了。

如果 R 的数量比 B 的数量多,Alice 将获胜。

如果 B 的数量比 R 的数量多,Bob 将获胜。

接下来考虑较特殊的情况:二者数量相等。

此时取走最后一个 RBBR 段的人将获胜,那么游戏变化为给定一个字符序列,两人每次取走一个 RBBR,取不了的人输。

观察其有什么性质。首先可以把连续多个同色的端切开,使其形成若干个子游戏,因为它们之间不会互相干扰。

例子:

BRBRRRBBRBR->BRBR R RB BRBR

既然我们想合并几个子游戏,首先可以想到 SG 函数。

考虑一个如何表示一个子游戏的状态。

因为该字符序列是 RB 相间的,所以一个子游戏的 SG 值是什么只和序列长度有关。

考虑一个状态的后继状态,玩家可以选择一个 i 并取走 i,i+1。也就是说 SG(n) 后继状态为 SG(i-1)\oplus SG(n-i-1)

那么有 SG 函数递推式:SG(n)=\operatorname{mex}\{\forall 1\le i<n,SG(i-1)\oplus SG(n-i-1)\}

此递推式为 O(n^2) 级别,无法通过此题。

不过,在输出 SG 函数的序列后,会发现它每一项值不大。可以猜测它存在循环节。

经过肉眼观察或者写一个 KMP 之后,可以得到其循环节长度为 34,于是在开始循环之后没必要再单次 O(n) 递推,直接按照循环节构建即可。

CF1451F Nullify The Matrix

题目大意

Ashish 和 Jeel 在玩游戏,有一个 n\times m 的棋盘,每个格子有一个非负整数的权值。

两个人轮流操作,每次操作先选择一个权值非 0 的格子作为起点,然后选择起点右下角的一个格子作为终点,然后选择它们之间的一条最短路径,然后给起点的权值减一个正整数、路径上每个点的权值随意加减(也可以不改变),但是都不能改成负数。

不能操作(全变成 0)就输了,Ashish 先手,问谁必胜。

题解

首先,观察题目有什么比较好的性质。

规则规定全部变成 0 游戏就结束了,可以联想到 SG 函数。

那么我们希望找到一种 SG 函数的构造,使得不为 0 的状态可以通过一步操作变成 0,为 0 的状态无论怎么操作都变不成 0

从后者入手,每次修改除了起点以外都可以随意更改甚至不更改。如果我们希望起点的修改会使 SG=0 的状态后继一定不为 0,那么不应该有任何其他数的修改可以修正起点的修改。

略微抽象,举个失败的 SG 构造的例子。

比如,我们定义 SG(S)S 状态每一行异或和或在一起。

那么当 SG(S)=0 时,玩家可以选择任意一个不为 0 的点作为起点,之后通过修改它其中一条最短路上同行的一个点,使这一行的异或和依然是 0

于是,这个构造不符合我们所期望的性质。

那么它不好在哪里?因为玩家可以修改能够抵消起点修改的某个值,上例中它是和起点同行的某个最短路上的数。

什么是最短路上的所有点都影响不到的关键字呢?

注意到 (x,y)(n,m) 最短路上的点都可以表示为 (x+a,y+b),其中 a+b>0

也就是说,最短路上每个点的 x+y 一定和起点不同!

我们定义 SG 函数为每条斜线的异或和或起来。

SG0 仅当每个斜线异或和均为 0,在一次修改中只能修改起点所在斜线一个点且一定发生改变,此时 SG 一定不为 0

那么如何操作使任意 SG(S)\ne 0S 变成 0

首先,起点一定在 x+y 最小且异或和不为 0 的斜线上,根据 Nim 游戏的结论,可以知道我们一定可以选出一个点这条斜线异或和变成 0

同时,这条斜线之后的斜线上一定有处于最短路上的点,修改这些点使这些斜线异或和为 0 即可。

AGC026F Manju Game

题目大意

有一排盒子,每个盒子里有若干个石子,Alice 和 Bob 轮流进行如下操作:

当所有盒子都被选过的时候游戏结束,两人皆会最大化自己的石子数量,Alice 先手,问结束时两人持有的石子数量。

## 题解 操作本质上相当于:先手选择一个点,后手选择一个方向,之后两人交替着取完剩下的部分,之后再选让我们称这个过程为一轮。 那么考虑什么时候先后手会交换:选择的方向上有奇数个石子。 因为与奇偶性相关,于是我们考虑分讨 $n$ 的奇偶性。 当 $n$ 是偶数时: 首先,Alice 至少可以取到所有奇数或者所有偶数。这对应了初始选 $1$ 或 $n$。 这同时也使 Bob 取到答案最大值。 如果 Alice 没有选 $1$ 或 $n$,说明通过操作可以使取到的石子数量更多。 Bob 希望 Bob 取得尽量多,相当于 Bob 希望 Alice 取得尽量少。 那么 Bob 如果存在方案使 Alice 取不到比全奇或全偶更优的,Bob 便取到了 Bob 的最大值。 假设 Alice 先选择了某个点,因为 $n$ 是偶数,Bob 一定可以选择一个方向使下一轮 Bob 变为先手。 既然 Bob 变成了先手,他可以选一个边上的使得 Alice 只能取到全奇或者全偶,这是 Bob 的最优答案。 即 ${XXXXX}\red{A}{BA}\to {XXXX}\red{B}{ABA}\to {BABABABA}$。 也就是说 Bob 总有方案使得 Alice 只能取全奇或全偶,那么 Alice 便只能取奇偶中较大者。 当 $n$ 是奇数时: 此时 Bob 不一定有方案使自己取到先手。 还是考虑 Alice 答案的最小值,全奇显然有,全偶也可以有,因为选择任意偶数后先后手不会改变。 由此,会发现 Alice 始终不会将先手权让给 Bob,因为 Bob 为了最小化 Alice 的收益一定会立马选全奇或者全偶,那还不如让 Alice 自己来选。 在 $n$ 是奇数时,Alice 一直保持先手权的方法就是每次选的点都是偶数。 但这样答案相当于全偶,为了让答案更大,Alice 应该选选奇数。 因为始终不能交出先手权,所以只有最后一轮 Alice 可以选择奇数点,并且对于剩下部分的奇数全取。 这段区间应当是一个连续的区间,我们只需考虑它在哪以及如何取到。 为了方便考虑,我们重新定义权值,定义奇数位置的权值是正的,偶数位置的权值是负的。 而 Alice 初始拥有所有偶数,它可以选择一个区间并得到区间内的权值和(舍弃部分偶数取奇数)。 但区间并不能随意选择,因为 Bob 会最小化这个值。 当 Alice 每次选完点后,Bob 都会选择这个点两侧的一个区间并禁止 Alice 去选。 ![pA2S6nf.png](https://s21.ax1x.com/2024/11/15/pA2S6nf.png) 注意到,这些决策形成一个类似线段树的结构,Alice 最后会停在一个叶子上,而 Bob 每次删掉一个区间,那么 Bob 一定能促使 Alice 最后选的区间是最小的叶子区间。 考虑最小的叶子区间最大会是多少,一个标准的二分答案的形式,检查是否存在若干个大于等于 $x$ 的区间即可。 具体的,维护最小合法点前缀和,每次判断当前点是否是合法点,如果 $n$ 合法即存在合法划分。