博弈论小记
command_block · · 个人记录
博弈论基本框架
- 公平组合游戏
有一个游戏状态
玩家的操作可以使得状态发生变化 :
满足如下特征 :
-
两个玩家面对同一个状态
G ,其可能的目标状态集合是相同的。(决策公平) -
两个玩家都知道有关游戏的所有信息。(无隐藏信息)
-
不包含随机成分。(无随机过程)
-
只有赢或输,没有平局。(无平局)
一般而言,都约定 : 两个(绝顶聪明的)玩家采取对自己最有利的决策,且轮流作出决策。
- 必胜态和必败态
先手存在必胜策略的状态
反之称作必败态,又作
若某个态
反之,则必然把
利用这些基本知识已经可以做一些初等的博弈论题目。
-
「一堆石子」
题意 : 有一堆
n 个石子,对于每个k 给出集合S_k ,当还剩k 个石子时,拿去石子的个数c 必须\in S_k 。 无法操作的人输。问是否先手必胜。
记
边界 :
转移 :
复杂度为
-
HDU 2897邂逅明下
题意 : 有一堆
n 个石子,每次可以拿去p\sim q 个,无法操作的人输。问是否先手必胜。
这是第一题中
对于
对于接下来的
对于
如此归纳,不难发现 : 若
当然,打表观察也是一个非常好的办法。
- 带权博弈
游戏中的每种转移方式都有不同的权值,游戏的得分是每一步转移的权值之和。
在首要目标是获胜的前提下,还可能希望最大化/最小化得分。
显然,胜负博弈是带权博弈的子集。
-
「一堆石子」贰
题意 : 有一堆
n 个石子,对于每个k 给出二元组集合S_k 。当还剩
k 个石子时,拿去石子的个数c 必须满足 : 存在(a,b)\in S_k ,使得a=c ,且这一步会获得b 分。在首要目标是获胜的前提下,先手 A 希望最小化得分,后手 B 希望最大化得分。问最终胜负以及得分。
记
若
即
若先手必败,则不设
即
- P1857 质数取石子
这是上一题中
不同的是,游戏的胜负会影响决策 : 必胜者希望权值小,必败者希望权值大。这反倒统一了两个人的决策。
记
若
否则在所有后继状态中取
单次询问复杂度为
- P4363 [九省联考2018]一双木棋chess
记落子状态为
考虑如何简洁地表示一种落子状态,不难发现,有子和无子的界限是一条左下到右上的路径,且只能向上或向右。
用
本质不同的局面个数为
每个局面的转移为
用 unordered_map 记录状态然后记忆化搜索,复杂度即为
评测记录
\bf SG 函数与 \bf SG 和
-
定义:
约定终止态的
SG 函数值为0 。定义
{\rm mex}(S) 为集合S 中最小的未出现的自然数。 (要求S\subseteq N )设
G 能转移到状态集合T_G (转移关系可以看成DAG),那么定义SG(G)={\rm mex}\big\{SG(V):V\in T_G\big\} 人话就是 : 能转移到的状态集合的
SG 函数值的\rm mex 。 -
性质 :
SG(G)=0 的G 是必败态,反之是必胜态。若
SG(G)=0 ,则代表后继的SG 没有0 ,反之则代表有0 。从终止态出发归纳即可证
SG=0\Leftrightarrow 必败态。
对于单个游戏,
下面我们将看到,
考虑两个人同时面对多个游戏,但每次只能操作其中一个。
把游戏间的并列关系定义为
(若暂时无法理解并列关系和互相独立的准确意义,可以先看下方“Nim”问题)
定理 :
这给出了游戏合并后的
证明 : 记
等价于证明
由于我们在
-
\forall_{x<y},?_{G\rightarrow G'}SG(G')=x 记
d=x{\ \rm xor\ }y ,其最高位为k 。设A' 为A 能转移到的某个状态, 同理有B' 。显然
x,y 中必有一个第k 位为1 。若
x 的第k 位为1 ,又由于k 是最高位,x 需要把y 前面的东西都抵消掉。这样,x 比k 高的部分和y 相同,而第k 位比y 大,与x<y 矛盾。因此,
y 的第k 位为1 ,故SG(A),SG(B) 中必有一个第k 位为1 。不妨设
SG(A) 的第k 位为1 ,这样SG(A){\ \rm xor\ }d 会消去第k 位,且更高位不变,结果一定会变小。 即SG(A){\ \rm xor\ }d<SG(A) 。这样,由
SG 函数的定义,必然存在一个SG(A')=SG(A){\ \rm xor\ }d=x{\ \rm xor\ }SG(B) ( 代入d )。即存在
SG(A'+B)=SG(A'){\ \rm xor\ }SG(B)=x 。 -
\forall_{G\rightarrow G'}SG(G')≠y 若存在
SG(A'+B)=SG(A'){\ \rm xor\ }SG(B)=SG(A){\ \rm xor\ }SG(B) ,则有SG(A)=SG(A') ,矛盾。
不同种类的游戏在求出
-
\bf Nim P2197 【模板】nim游戏
有
N 堆石子,两个人轮流操作,每次可以把某一堆石子拿去若干。没有石子定义为终止态。求
N/P 态的判定方法。
我们先来观察单个堆的
首先,若该堆为空,则为终止态,
接下来,
现在来考虑多堆石子的情况,使用
至于必胜策略,每次需要将异或和变为
查看异或和的最高位,选出一个包含该位的数,将这一位置为
后面的位无论怎样变化,都会比原来的值小,那么随意安排,把其余非
例 : 有
\begin{cases}1010000\\ 0001000\\ 1000010\end{cases} , 那么异或和为0011010 。所以,选择
1010000 来操作,将其变为1001010 异或和就变为0 了。
-
\bf Take\ Away 有
m 个石堆,包含n 个石子,每一轮可以取走1...k 个棋子,不能操作者负。
先来考虑单堆。
当
当
然后对于
如此可得
多堆只需求
-
\bf Hungergame 有
m 个箱子,每个箱子中都有若干石子,双人博弈,每一轮可以采取下列操作之一:-
打开若干个箱子
-
将某个箱子中的石子取出若干。
-
由于可以一次打开多个箱子,这些游戏是不独立的,不能直接套用
当所有的箱子都打开的时候,就是经典的
考虑先手打开什么,若开了异或和不为
这样,对面就能逼着你没法操作石子,再开一次箱子。如果每次开完箱子后异或和总是非
反之,若能开出一个异或和
只需要在第一步开极大的异或和
所以判别的方法就是 : 是否存在一个集合使得异或和为
-
\bf Staircase 有
n 层阶梯,编号1…n ,每层阶梯上有一些石子。两个玩家轮流操作,每次操作可以将第
j 层阶梯上若干(至少一个)石头放到j-1 层阶梯上,第0 层阶梯即为地板。将最后一颗石头从阶梯移到地板上的玩家胜利。
不难发现,所有偶数阶梯都等价于垃圾桶。若一方尝试将偶数阶梯中的石子移出(至奇数阶梯),下一个人只需要紧跟着把这些石子丢到下一个(偶数)阶梯即可,最终会到达地板。这个过程中,先后手是不会转换的。
接下来考虑奇数阶梯,一步就可以把任意多的石子丢进垃圾桶,实际上就等价于
例题 : P5363 [SDOI2019]移动金币
-
\bf Gra 有
m(\leq 10^9) 个格子排成一行,从左到右编号1…m ,其中n(\leq 10^5) 个给定的格子里有硬币,且编号为m 的格子里没有硬币。两人轮流操作,每次选择一个硬币,移动到它右边第一个不含石子的格子里。
将某个石硬币移动到编号为
m 的格子的人胜利。
考虑将某个硬币移动到
由此可以想到,将一枚硬币看做大小为 右侧空格数 的石子堆,每次可以拿掉一个,最早将某一堆拿空的人赢。
但是,事情并没有这么简单,当你移动某个棋子的时候,可能会填掉其他一些棋子右侧的一个空位。
手玩能够发现,这样的影响只会发生在“跳过”某一段棋子时。通过选择这一段中谁跳,可以使得大小为
这其实很像下阶梯,我们再进行一步转化,可以把某一段硬币视作一个阶梯上的石子堆,就可以等效为
-
\bf Take\ and\ Break - P3185 [HNOI2007]分裂游戏
有
n 堆硬币 , 编号为0…n-1 。两名玩家轮流取硬币 , 每一轮中 , 选取
3 堆硬币i,j,k (i<j,j≤k )从
i 中取出一枚,并向j,k 中各放入一枚 (如果j=k 则向k 中放入2 枚)。不能按上述规则操作的人输。
若将每个位置的硬币堆看做一个子游戏,其两两之间会互相影响。
但是,若把每个硬币看做一个子游戏,不难发现这些游戏两两独立。
可以把在位置
那么,操作的意义就是 : 选取一堆石子,并分裂成两堆比自己小的石子。
这样,就可以对单堆递推出
[评测记录] ()
-
P5387 [Cnoi2019]人形演舞 | Sol
-
\bf Lasker's\ Nim 每次可以从一堆中拿走若干石子,或者将一堆分裂成两个非空石堆。
此时每堆石子是独立的,可以单独分析。
对与状态
若值域是
-
一维翻硬币问题
按照某种规则选取硬币集合翻转,但是受到操作的**最右侧**的硬币必须从正面翻到反面(否则转移可能成环)。 注意到,两个完全相同的游戏在 $\rm SG$ 和中会互相抵消,故将反面朝上的硬币翻为正面朝上可以简单地视作多添加了一个同样的反面朝上的硬币而造成抵消。 -
\bf Turning\ Turtles 一维翻硬币问题。每次可以选择一枚或两枚硬币翻转,无法操作的玩家输。
可以等价于
若单翻
若翻
当
我们能够发现,
此处也就相当于增加一堆
-
一维翻硬币问题又一例 : P4077 [SDOI2016]硬币游戏 | Sol
-
\bf Mock\ Turtles 一维翻硬币问题。每次可以翻转一个、两个或三个硬币,最右边的硬币必须从正面翻到反面。
奥妙重重。
-
\bf Anti-SG
规则和上文中的公平组合游戏略有不同,规定得到终止态的玩家获胜(称之为“
此时,两个游戏的和
此时,
-
SJ 定理 : 设
G_{1...m} 为游戏组合中的所有游戏,以\text{Anti} 规则进行,则先手必胜的充要条件为 :-
\bigoplus\limits_{i=1}^m SG(G_i)\neq 0$ 且 $\max\limits_{i=1}^m SG(G_i)>1 -
\bigoplus\limits_{i=1}^m SG(G_i)= 0$ 且 $\max\limits_{i=1}^m SG(G_i)\leq1
两者之一成立。
-
证明 :
考虑归纳并分类讨论。
首先,终止态是
-
若只有一个
SG(G_i)>1 ,则将其操作为SG(G_i')=0 或1 ,使满足条件 3。若有多个
SG(G_i)>1 ,根据经典SG 理论,可以修改其中一个使得异或和变为0 ,使满足条件 4。 -
将任意一个
SG(G_i)=1 变成SG(G_i')=0 即可满足条件 3。 -
对于任意一个可操作的
G_i 都有SG(G_i)=1 。这说明对于所有G_i\rightarrow G_i' ,都有SG(G_i')\neq 1 。若
SG(G_i)=0 ,则满足条件 2。若SG(G_i)>1 ,则满足条件 1。 -
此时不可能只有一个
SG(G_i)>1 ,所以一次操作后仍有\max\limits_{i=1}^m SG(G_i)>1 。根据经典
SG 理论,一次操作后异或和必然非0 ,则满足条件 1.
-
\bf Misère\ Nim P4279 [SHOI2008]小约翰的游戏
规则同
\rm Nim ,但是取得最后一个石子的人输。
直接套用
评测记录
-
\bf Nim_k 规则同
\rm Nim ,但是每一轮可以同时操作1…k 个石堆。
此时,游戏之间并不是独立的,不能套用经典的
观察普通
对应到
在
可以猜测
-
Nim-k 定理 : 设
A_{1...m} 为各堆石子数目。将
A_{1...m} 用二进制表示。将这些二进制数直接看做k+1 进制数,然后做不进位加法。若结果为0 则先手必败,反之必胜。形式化地,记
A_i=\sum\limits_{j=0}g_{i,j}*2^j ,先手必败当且仅当\forall j,\sum_{i=1}^mg_{i,j}\bmod(k+1)=0 。
证明 :
我们暂称上述
考虑归纳,终止态的特征值显然为
-
特征值非
0 需证能找到一个特征值为
0 的后继。考虑和
\bmod (k+1) 不为0 的最高位,假设和为m(\leq k) 。任意选出
m 个在该位为1 的石子堆,并将其这一位置为0 ,则之后可以随意设置。考虑下一个和
\bmod (k+1) 不为0 的位,假设和为r 。设之前选中的m 堆石子此时有a 个1 ,b 个0 。分类讨论 :
-
①
a\geq r ,在a 个1 中选r 个变为0 。 -
②
b\geq k+1-r ,在b 个0 中选出k+1-r 个变为1 。 -
③
a<r,b<k+1-r ,考虑再征用r-a 个为1 的石子堆。这样,操作的总堆数即为
m+r-a=a+b+r-a=b+r<k+1-r+r=k+1 ,合法。将
m 更新为m+r-a 。
-
-
特征值为
0 需证找不到一个特征值为
0 的后继。我们最多改变
k 堆石子,故每一位上1 的数目变化量是[-k,k] 的。现在问题是 : 将
若每一列的变化都为
0 ,则说明每一个0\rightarrow 1 都对应一个同位的1\rightarrow 0 。但是,操作只能使得
A 变小,所以某个0\rightarrow 1 一定在更高位有一个0\rightarrow 1 。这样,最高位一定都是
0\rightarrow 1 ,矛盾。
注意,
-
例题 : P2490 [SDOI2011]黑白棋 | Sol
-
\bf Misère\ Nim_k
设石子数转二进制后视为
先手必胜当且仅当下列两条之一成立 :
-
不存在
>1 的石堆,且堆数\bmod(k+1)\neq 1 -
存在
>1 的石堆,且S\neq 0
证明略。
\bf SG 积
-
二维翻硬币问题
按照某种规则选取硬币集合翻转,但是受到操作的**最右下侧**的硬币必须从正面翻到反面(否则转移可能成环)。 类似地,翻面操作可以看做新增一枚正面朝上的硬币。 -
\bf Acrostic\ Twins 二维翻硬币问题。每次操作可以翻转两枚硬币,两枚硬币要么同行,要么同列。
类似地,可以把一个硬币看做两堆大小分别为
不难看出
-
二维翻硬币问题。是每次操作可以翻转某个矩形角上的四个硬币。
并不容易直接看出
设
有
(图表来自 @Owaski)
仍然没有发现? 那就对了……几分钟就能看出来的东西也太廉价了吧……
本问题非常经典,
把
对自然数
(即为
-
- 基本运算法则 不加证明地给出下列运算法则 : (It sounds amazing!) $$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 x=0,\ 1\otimes x=x$。 根据这些法则,可以在计算 $x\otimes y$ 时进行一系列转化。 $$12\otimes 9=(8\oplus 4)\otimes (8\oplus 1)=(8\otimes 8)\oplus(8\otimes 1)\oplus(4\otimes 8)\oplus(4\otimes 1)$$ 然后查表,最终答案为 $13\oplus 8 \oplus 11 \oplus 4=10$。 一般步骤 : 先将 $x\otimes y$ 中 $x,y$ 二进制拆分,然后利用分配律展开,最后得到一系列 $2$ 的幂次的 $\rm SG$ 积。 这样,我们只需解决所有 $2$ 的幂次的 $\rm SG$ 积,之后查 $O(\log^2 x)$ 次表即可完成任意 $\rm SG$ 积的计算。 但是,打表的时间消耗仍然非常大。 - Fermat 2-power 经过数学家们的努(gao)力(shi),我们现在有两个更加强大的运算法则 : 定义 Fermat 2-power 为形如 $2^{2^n},n\in N$ 的数,集合记为 $F_2$。 对于 $x\in F_2$ ,对于任意一个 $y<x$ ,有 $x\otimes y=x\times y$ , $x\otimes x=\frac{3}{2}x$。 例 : $3\otimes 16=48,\ 4\otimes 4=6$。 现在我们能快速解决 $F_2$ 中数的 $\rm SG$ 积,但是非 $F_2$ 的 $2$ 的幂次仍然无法直接解决。 - 最终计算 当计算 $x\oplus y$ 且 $x$ 为 $2$ 的幂次时 ,设 $G(x,y)=x\otimes y$。 找到 $a$ 满足 $2^{2^a}\leq x< 2^{2^{a+1}}$ ,令 $M=2^{2a}$ 。 将 $x,y$ 表示成 $x=p\otimes M,y=(q\otimes M)\oplus t$。 (其中 $p=x/M$ , $s$ 尽量小) $$ \begin{aligned} G(x,y) &=(p\otimes M)\otimes\big((q\otimes M)\oplus t\big)\\ &=(p\otimes q\otimes M\otimes M)\oplus(p\otimes t\otimes M)\\ &=\big(p\otimes q\otimes (M\oplus\tfrac{M}{2})\big)\oplus(p\otimes t\otimes M)\\ &=\big(p\otimes q\otimes (M\oplus\tfrac{M}{2})\big)\oplus(G(p,t)\otimes M)\\ &=\big(p\otimes q\otimes M)\oplus(p\otimes q\otimes\tfrac{M}{2}\big)\oplus(G(p,t)\otimes M)\\ &=\big(G(p,q)\otimes M)\oplus G(G(p,q),M/2)\oplus(G(p,t)\otimes M)\\ \end{aligned} $$ 这将 $G(x,y)$ 的计算转化成了 $G(p,q),G(G(p,q),M/2),G(p,t)$ 的计算。 设 $g(n)$ 为计算 $G(x,y)$ 且 $x,y\leq 2^{2^n}$ 时的复杂度。 则有 $g(n)=3g(n-1)$ 即 $g(n)=O(3^n)=O\big((\log x)^{\log_2^3}\big)\leq O(\log^2x)$。 由此,在 $O({\rm poly}(\log w))$ 的预处理之后,即可 $O(\log^2 w)$ 计算 $\rm SG$ 积。 -
游戏的积
在能够快速计算