博弈论学习笔记
才发现我不会博弈。
前置
【公平博弈】
满足以下条件的博弈:
- 由两名玩家交替行动。
- 任意一个游戏者在某一确定状态可以作出的决策集合只与当前的状态有关,而与游戏者无关。
- 游戏中的同一个状态不可能多次抵达,游戏以玩家无法行动为结束,且游戏一定会在有限步后以非平局结束。
【非公平博弈】
所有不是公平博弈的博弈。
【定义】
- 先手:该游戏中第一个操作的玩家。
- 后手:该游戏中第二个操作的玩家。
- 局面:该游戏在某个时刻的状态。
- 必败局面:当前操作玩家无论如何操作,都不可能赢的游戏状态。
- 必胜局面:当前操作玩家存在至少一种操作,使得操作后的局面为必败局面。
- 必败点:记做 \(P\),表示当前局面下先操作的玩家必败。
- 必败点:记做 \(N\),表示当前局面下先操作的玩家必胜。
- 最终态:一个无法继续操作的局面。
有定理:
- 必败局面要么是最终态,要么所有后继状态都是必胜局面。
- 必胜局面一定存在一个后继状态是必败局面。
- 所有最终态都是必败局面(*)。
- \(P\) 点的后继点都是 \(N\) 点。
- \(N\) 点的后继点中一定存在 \(P\) 点。
- 所有最终态都是 \(P\) 点(*)。
公平博弈
Nim 游戏
有 \(n\) 堆石子,第 \(i\) 堆有 \(a_i\) 个,先后手轮流取石子,每次可以取出某一堆中任意正整数颗石子,无法取石子的一方失败。问先手是否必胜。
考虑最终局面一定满足 \(\forall 1 \le i \le n, a_i =0\)。
假设一个满足 \(\bigoplus\limits_{i=1}^{n}a_i = 0\) 的局面是必败局面,反之是必胜局面,考虑证明:
若假设成立。
对于最终态,已知其是必败局面,且 \(\forall 1 \le i \le n, a_i =0\)。根据假设也判定为必败局面,成立。
对于一个满足 \(\bigoplus\limits_{i=1}^{n}a_i = 0\) 且不是最终态的局面,无论操作哪一个 \(a_i\) 都会使 \(\bigoplus\limits_{i=1}^{n}a_i \ne 0\)。满足定理 \(1\)。
对于一个满足 \(\bigoplus\limits_{i=1}^{n}a_i \ne 0\) 的局面,如果假设成立,需要满足存在至少一种方案能使 \(\bigoplus\limits_{i=1}^{n}a'_i = 0\)。记 \(k = \bigoplus\limits_{i=1}^{n}a_i\),则存在 \(a_i \oplus (a_i - x) = k\)。则 \(a_i \oplus k = a_i - x\)。也就是 \(a_i \oplus k < a_i\)。显然一定存在一个 \(i\),使得 \(a_i\) 二进制下第 \(highbit(k)\) 位为 \(1\)。那么对于这个 \(i\) 来说,异或 \(k\) 之后第 \(highbit(k)\) 位就变成 \(0\) 了,一定比原 \(a_i\) 小。满足定理 \(2\)。
那么 \(\bigoplus\limits_{i=1}^{n}a_i = 0\) 是必败局面符合定义。则只需要判断初始局面 $\bigoplus\limits_{i=1}^{n}a_i $ 和 \(0\) 的关系。
限定取物数上限的 Nim 游戏
同 Nim 游戏,增添每轮不能取超过 \(k\) 颗石子的限制。
将 \(a_i\) 分成 \(b_i,c_i\),使得 \(a_i = b_i + c_i\) 且 \(0 \le b_i \le k, k|c_i\)。
那么对于 \(b\) 的部分,和 Nim 游戏是一致的;对于 \(c\) 的部分,无论先手取多少颗石子,后手都可以在同一堆取 \(k+1\) 减去这么多颗石子,保证后手不对 \(c\) 部分先取。
由于先手操作第一轮,所以在 \(b\) 部分必胜的情况下,一定可以让后手成为 \(c\) 部分的先手;在 \(b\) 部分必败的情况下,后手一定可以让先手先操作 \(c\) 部分。
所以等价于判断 \(\bigoplus\limits_{i=1}^{n}(a_i \bmod (k+1))\) 和 \(0\) 的关系。
NimK 游戏
同 Nim 游戏,增添每轮可以在不超过 \(k\) 堆石子任意取的限制。
结论:对于二进制下每一位,如果都满足其 \(1\) 的数量是 \(k+1\) 的倍数则必败。
显然最终态满足判定条件。
对于一个判定为必败局面且不是最终态的局面,如果存在一个后继局面也是必败局面,说明至少一个二进制位同时减去了 \(k+1\) 个 \(1\),而这 \(k+1\) 个 \(1\) 来自不同的石子堆,不符合题目限制。
对于一个判定为必胜局面的局面。从高往低考虑,记当前已经选择了 \(k_0\) 堆石子。对于第 \(i\) 位,如果其 \(1\) 的数量不是 \(k+1\) 的倍数,由于之前选择的那 \(k_0\) 堆石子在这一位上可以任意是 \(0\) 或 \(1\),则当 \(k_0 \ge cnt \bmod (k+1)\) 时是可行的;否则在这一位上另选 \(cnt \bmod (k+1) - k_0\) 个石子堆减去 \(2^i\)。显然最后 \(k_0 \le k\),即存在一个后继局面为必败局面。
P2490 [SDOI2011] 黑白棋
把第 \(i\) 个白棋和第 \(i\) 个黑棋看作一段。那么相当于有 \(\frac{k}{2}\) 堆石子的 NimK 游戏。
考虑计算必败局面数量。记第 \(i\) 堆石子的数量为 \(a_i\)。那么在已知 \(a\) 时方案数为 \(\binom{(n - k- \sum a_i) + \frac{k}{2}}{\frac{k}{2}}\)。则只需要计算有多少个序列 \(a\) 满足条件。
定义 \(f_{i,j}\) 表示考虑到二进制下前 \(i\) 位,\(\sum a_i = j\) 且满足条件的方案数。那么 \(f_{i,j + (d+1)x 2^i}\gets f_{i-1,j}\binom{\frac{k}{2}}{(d+1)x}\)。时间复杂度 \(O(nk\log n)\)。
阶梯 Nim 游戏
有 \(n\) 堆石子,每次要么将第 \(i(i > 1)\) 堆石子中的正整数颗石子移动到 \(i-1\),要么将第 \(1\) 堆石子中的正整数颗石子拿走。问先手是否必胜。
考虑奇数堆和偶数堆的区别。发现对于偶数堆,由于 \(i \ge 2\),所以移动到 \(i-1\) 后下一个人一定能继续移动到 \(i-2\)。而对于奇数堆,当 \(i=1\) 时下一个人就不能移动了。
结论:奇数下标 \(a_i\) 异或和为 \(0\) 的局面是必败局面。
最终态满足条件。
如果异或和为 \(0\),那么无论操作奇数还是偶数堆,都不会使异或和为 \(0\)。满足定理 \(1\)。
如果异或和不为 \(0\),根据 Nim 游戏,一定可以选择一个奇数堆中某些石子,使得其移动到前一个偶数堆或拿走后异或和为 \(0\)。满足定理 \(2\)。
P3480。
Fibonacci Nim 游戏
有一堆 \(n\) 个石子,第一次可以取任意正整数个石子,之后每一次取出的石子数不超过前一次的 \(2\) 倍。问若先手想要有必胜策略第一次至少要取多少个石子。
定义一个点的状态为 \((x,y)\),表示当前局面剩下 \(x\) 个点,且第一步最多取 \(y\) 颗石子。
那么有:
- \(x >0\)。\(SG(x,y) =\operatorname{MEX}(\{SG(x-i,\min(x-i,2i))|1 \le i \le y\})\)。
- \(x = 0\)。\(SG(x,y) = 0\)。
观察 SG 函数,记 \(f(x)\) 为最小的 \(y\),使得 \(SG(x,y)\ne 0\)。其中 \(SG\) 函数见后文。
将 \(f(1)\dots f(100)\) 打出来,发现 \(f(i)\in Fib\),其中 \(Fib=\{1,2,3,5,8,\dots\}\),也就是斐波那契数列。
不难注意到,\(f(i)\) 应该是最小的斐波那契数 \(x\),满足可以将 \(i\) 表示成若干互不相同的斐波那契数的和,且这些斐波那契数的最小值为 \(x\)。
那么只需要找 \(i\) 的最小斐波那契表示。
求这个只需要每次能减就减就行了。时间复杂度 \(O(\log n)\)。
Wythoff 游戏
【其它】
像这种博弈游戏,我们需要找到的是对必胜局面或必败局面的判断条件,一般可以根据游戏限制的特殊性或者暴力打表(通过最终态反推,根据定理 \(1,2\) 判定局面是必胜还是必败)瞪出来,吗?
SG 函数
显然任意一个公平博弈都可以把每个局面看成图上的一个点,通过前驱后继关系建边后得到 DAG。
定义 SG 函数为:
- 最终态有 \(SG(x) = 0\)。
- 点 \(u\) 的 \(SG(u)\) 满足:\(SG(u) = \operatorname{MEX}(\{SG(v)|(u,v)\in E\})\)。
显然,当 \(SG(u) \ne 0\) 时局面 \(u\) 是必胜局面,反之是必败局面。
定义一个游戏 \(G\) 可以拆分成若干个子游戏 \(G_1,G_2,\dots,G_k\) 为:
- 每轮操作可以任意选择一个子游戏操作。
- 游戏 \(G\) 停止的条件为 \(G_1,G_2,\dots,G_k\) 均停止。
有定理:\(SG(G) = \bigoplus\limits_{i=1}^{k}SG(G_i)\)。类比 Nim 游戏。
P6791,P6847。
反 SG 游戏
不能操作的一方赢。
设游戏为 \(G\),且 \(G\) 可以拆成子游戏 \(G_1,G_2,\dots,G_k\)。
若初始局面 \(G\) 是必胜局面,则需要满足以下两个条件之一:
- \(SG(G) \ne 0\) 且存在至少一个子游戏满足 \(SG(G_i)>1\)。
- \(SG(G) = 0\) 且所有子游戏满足 \(SG(G_i)\le 1\)。
题
P5387 [Cnoi2019] 人形演舞
只需要单独考虑一个数 \(x\) 的 SG 函数值。序列 \(V\) 合法当仅当 \(\bigoplus\limits_{i=1}^{|V|}SG(V_i) \ne 0\)。
打表发现 \(\operatorname{SG}(x)= x - 2^{hib(x)} + 1\)。特别的,\(SG(0) = 0\)。
记 \(A_i = \sum\limits_{j=1}^{m}[\operatorname{SG}(j) = i]\)。那么答案为 \(\sum\limits_{i\ge 1}^{} (A^{|V|})_i\)。其中 \(A^{|V|}\) 中乘法为异或卷积。
时间复杂度 \(O(m\log m +m\log |V|)\)。
P3235 [HNOI2014] 江南乐
对于一个局面维护当前每堆石子有多少个,记为可重集 \(S\)。
对 \(S\) 维护 SG 函数。
- \(|S|=1\) 时。记 \(x\) 为 \(S\) 中的元素。
- \(x < F\) 或 \(x = 1\)。\(\operatorname{SG}(S) =0\)。
- \(x \ge F\) 且 \(x \ne 1\)。\(\operatorname{SG}(S) =\operatorname{MEX}\limits_{M=2}^{x}(\operatorname{SG}(\{\lfloor\frac{x}{M}\rfloor+1\})[(x\bmod M)\bmod 2=1])\oplus(\operatorname{SG}(\{\lfloor\frac{x}{M}\rfloor\})[(M -x\bmod M)\bmod 2=1])\)。
- \(|S| > 1\) 时。\(\operatorname{SG}(S) =\bigoplus\limits_{x\in S}^{}SG(\{x\})\)。
那么只需要维护 \(SG(\{x\}),x\in [1,10^5]\) 了。
AT_agc010_f [AGC010F] Tree Game
在当前所在点 \(A_i=1\) 且邻域不存在 \(A_j =0\) 时先手必输。因为操作完之后无论移动到哪个点后手都可以移回来。
策略应该是让自己所在点的权值尽可能大。
注意到在操作完 \(i\) 后一定是移动到一个小于 \(A_i\) 的点。因为如果移动到 \(A_j > A_i-1\),后手一定可以再移动回来,此时 \(A_i\gets A_i-2\)。而如果移动到 \(A_j \le A_{i}-1\),后手移动回来对先手是不列的,因为先手可以再移动到 \(j\) 让后手的值比先手的值小。
那么在 \(A_u < A_v\) 的时候连 \(v \to u\) 的边,得到 DAG。问题变成不能移动的人输。跑一遍 SG 函数即可,时间复杂度 \(O(n)\)。
SP11414 COT3 - Combat on a tree
维护每个子树根是白点时这个子树的 SG 函数值,记为 \(\operatorname{SG}(u)\)。
首先这个黑点没用,新建一个只有白点的森林。
对每个点 \(x\) 维护对于当前点 \(u\) 来说,\(P(x,u)\) 中点的所有非 \(x\) 祖先的儿子的 \(\operatorname{SG}\) 值异或和,记为 \(f(x)\)。
那么对于 \(u\) 儿子 \(v\) 子树内的点,更新 \(f(x)= f(x)\oplus g(u)\oplus v\),其中 \(g(u)\) 为 \(u\) 儿子的 \(\operatorname{SG}\) 值异或和。
对于 \(u\),有 \(f(u)= g(u)\)。
\(\operatorname{SG}(u)= \operatorname{MEX}\limits_{v\in T(u)}^{}f(v)\)。
相当于是区间异或上一个值,求区间 \(\operatorname{MEX}\)。
随便做做到 \(O(n\log n)\)。
AT_agc016_f [AGC016F] Games on DAG
这种题我能出一万道,有啥意思。
考虑先判定 \(G\) 能否必胜。
首先两个棋子是两个独立的游戏。维护 \(\operatorname{SG}(x)\) 表示棋子在 \(x\) 这个局面的 SG 函数。那么 \(\operatorname{SG}(u)=\operatorname{MEX}\limits_{(u,v)\in E}^{}\operatorname{SG}(v)\)。
当 \(\operatorname{SG}(1)\oplus \operatorname{SG}(2) \ne 0\) 时必胜。
时间复杂度 \(O(n^2)\)。
由于是 \(\operatorname{MEX}\),所以考虑按照 SG 值从小到大加入点 DP。
维护 \(f_s\) 表示当前 SG 值不超过 \(x\) 的点的集合为 \(s\) 的方案数。显然,任意一个不在 \(s\) 中的点 \(u\) 满足 \(\operatorname{MEX}\limits_{(u,v)\in E \land v\in s}^{}\operatorname{SG}(v) = x + 1\)。
现在考虑确定集合 \(t\) 中的点的 SG 值为 \(x\)。那么首先一个条件是不满足 \(\{1,2\}\subseteq t\),为的是 \(\operatorname{SG}(1)\oplus \operatorname{SG}(2) \ne 0\)。转移方程为:\(f_{s\cup t}\gets f_s\times g(s,t) [s\cap t =\emptyset]\)。其中 \(g(s,t)\) 为合法的保留边的方案数。
考虑什么样的保留方式合法。
对于一个点 \(u\),分情况讨论:
- \(u\in s\)。此时 \(u\) 在之前已经合法,不做限制。
- \(u \in t\)。应当满足所有 \(v \in t \land (u,v)\in E\) 的边都没被保留。
- \(u\notin (s\cup t)\)。应当满足至少保留一条 \(v\in t \land (u,v)\in E\) 的边。
我们在每个点 \(u\) 加入的时候顺带计算 \((v,u)\in E\) 这些边的贡献。
那么对于 \(u\in t\) 的这些点对应的那些边 \((v,u)\),记 \(e(s,t)\) 为 \(v\in s\land u\in t\land (v,u)\in E\) 的边数。\(h(s,t)\) 为对于所有 \(u\in s\),至少保留一条 \((u,v)\in E\land v\in t\) 的边的方案数。则贡献为 \(2^{e(s,t)}h(U/s/t,t)\)。其中 \(U =\{1,2,\dots,n\}\)。
时间复杂度 \(O(3^nn)\)。答案为 \(f_U\)。瓶颈在求 \(h(s,t)\)。
CF1033G Chip Game
考虑已知 \(a,b\) 怎么求,不妨设 \(a\) 是先手。
首先 \(v_i = x\) 和 \(v_i = x + (a + b)\) 结果一样。因为 \((a+b)\) 恰好支持两人各取一次,对结果不造成影响。
那么可以令 \(v_i = v'_i \bmod (a+b)\)。去掉 \(v_i <\min(a,b)\) 后 \(\min(a,b)\le v_i < a+b\)。
- \(a> b\)。则每一堆先手最多取 \(1\) 次。后手应当尽可能地让先手无法取这一堆。不妨设第一整轮先手取了 \(i\),后手取了 \(j\)。那么在 \(b \le v_j < a\) 时对后手来说实际上是不优的,因为先手本来就取不了。而在 \(a \le v_j < a+b\) 时,后手取完就变成 \(a - b \le v_j < a\) 了,先手就不能取 \(j\) 了。则:
- 存在 \(b \le v_i < a\)。后手必赢。因为只要当前局面上还剩下满足 \(a \le v_i < a+b\) 的 \(i\) 后手就可以任选一个;否则后手选择满足 \(b \le v_i < a\) 的 \(i\),且之后先手一定无法再操作。
- 不存在 \(b \le v_i < a\)。当存在至少两个满足 \(2b \le v_i\) 时后手必赢。因为后手可以在第一次轮到它时选择其中一个,然后就变成情况 \(1.1\) 了。而如果只存在最多一个,先手就可以先选择它让后手无法选择。
- 不存在 \(b \le v_i < a\) 且满足 \(2b \le v_i\) 的 \(i\) 至多 \(1\) 个时。当满足 \(a \le v_i < a+b\) 的 \(i\) 数量为奇数时先手必赢;否则后手必赢。
- \(a = b\)。那么此时是个公平组合游戏。当满足 \(a \le v_i < 2a\) 的 \(i\) 数量为奇数时先手必赢;否则后手必赢。
- \(a<b\)。则每一堆后手最多取 \(1\) 次。和情况 \(1\) 应该是差不多的,有:
- 存在 \(a \le v_i < b\)。先手必赢。
- 不存在 \(a \le v_i < b\)。当存在至少一个满足 \(2a \le v_i\) 时后手必赢。
- 不存在 \(a \le v_i < b\) 且不存在满足 \(2a \le v_i\) 时。当满足 \(a \le v_i < a+b\) 的 \(i\) 数量为奇数时先手必赢;否则后手必赢。
对于 Alice 必胜的情况就应该是当 Alice 是 \(a\),Bob 是 \(b\) 且无论 \(a\) 先手还是 \(b\) 先手都是 \(a\) 必胜。Bob 必胜同理,且方案数应该与 Alice 必胜相同。
考虑枚举 \(a+b =k\)。则现在 \(v_i < k\)。对于 \(i\) 来说:
- 当 \(b \le v_i < k - b\) 即 \(b \le \min(v_i, k - v_i - 1,\lfloor\frac{k-1}{2}\rfloor)\) 时,\((a,b)\) 后手必胜。对满足条件的 \(b\) 标记为 \(1\)。
- 当 \(k-b \le v_i < b\) 即 \(b \ge \max(k - v_i, v_i + 1,\lceil\frac{k+1}{2}\rceil)\) 时,\((a,b)\) 先手必胜。对满足条件的 \(b\) 标记为 \(2\)。
- 对 \(2b \le v_i \land b < k-b\) 即 \(b \le \min(\lfloor\frac{v_i}{2}\rfloor,\lfloor\frac{k-1}{2}\rfloor)\) 的 \(b\) 的 \(c1\) 增加 \(1\)。
- 对 \(2(k-b) \le v_i \land k-b < b\) 即 \(b \ge \min(k-\lceil\frac{v_i}{2}\rceil,\lceil\frac{k+1}{2}\rceil)\) 的 \(b\) 的 \(c2\) 增加 \(1\)。
- 对 \(k - b \le v_i < k\) 即 \(b \ge k - v_i\) 的 \(b\) 的 \(c3\) 增加 \(1\)。
最后对于一个 \(b\) 来说:
- \(b\) 被标记为 \(1\)。后手必胜。
- \(b\) 被标记为 \(2\)。先手必胜。
- \(b\) 的 \(c1\) 大于等于 \(2\),后手必胜。
- \(b\) 的 \(c2\) 大于等于 \(1\),先手必胜。
- \(b\) 的 \(c3\) 为奇数,先手必胜。
- \(b\) 的 \(c3\) 为偶数,后手必胜。
最后统计 \(b\) 和 \(k-b\) 必胜情况对称的数量。
任意维护时间复杂度 \(O(nm\log n)\)。

浙公网安备 33010602011771号