博弈论基(寄)础
几个基本的知识
有限博弈
- 先手必胜当且仅当先手将当前状态变为先手必败态
- 先手必败当且仅当先手不能将当前状态变为先手必败态
有向无环图博弈
- 给定一个
DAG " role="presentation" style="position: relative;">,初始1 " role="presentation" style="position: relative;"> 号点有一个棋子,小A " role="presentation" style="position: relative;"> 和小B " role="presentation" style="position: relative;"> 可以将棋子沿出边移动一次,最后无法移动的为输者。
SG 函数
- 基本描述:
-
对于有向无环图博弈,
S G ( i ) = mex ( S G ( j ) | e d g e ( i , j ) ∈ E ) " role="presentation" style="position: relative;">,mex " role="presentation" style="position: relative;"> 即未出现过的最小非负整数。则先手必胜则意味着S G ( 1 ) ≠ 0 " role="presentation" style="position: relative;">,也就是S G ( 1 ) = 0 " role="presentation" style="position: relative;"> 意味着先手必败态。 -
证明: 我们将分以下三个部分证明,
S G ( 1 ) ≠ 0 " role="presentation" style="position: relative;"> 时先手必胜:- 最终态是必败态:
- 显然最终态就是无法移动,也就是
S G = 0 " role="presentation" style="position: relative;">,也就是必败态。
- 显然最终态就是无法移动,也就是
- 必胜态可以走向必败态:
- 若
S G ( 1 ) ≠ 0 " role="presentation" style="position: relative;">,意味着我们可以走向S G = 0 " role="presentation" style="position: relative;"> 的点,也就是可以走向必败态
- 若
- 必败态只能走向必胜态:
- 当
S G ( 1 ) = 0 " role="presentation" style="position: relative;"> 时,显然不能走到S G = 0 " role="presentation" style="position: relative;"> 的点,所以只能走向必胜态
- 当
- 最终态是必败态:
-
子游戏
- 问题描述:
-
给定
m " role="presentation" style="position: relative;"> 个DAG " role="presentation" style="position: relative;">,小A " role="presentation" style="position: relative;"> 和小B " role="presentation" style="position: relative;"> 每次可以选择一个DAG " role="presentation" style="position: relative;">,并将其上的棋子沿出边移动一次,移动不了为输。 -
SG定理: 先手必胜当且仅当每个
DAG " role="presentation" style="position: relative;"> 的起点的S G " role="presentation" style="position: relative;"> 的异或值不等于0 " role="presentation" style="position: relative;"> -
证明: 依旧分以下三个部分证明:
- 最终态是必败态:
- 最终态就是无法移动,所有的
S G " role="presentation" style="position: relative;"> 都等于0 " role="presentation" style="position: relative;">,显然是必败态
- 最终态就是无法移动,所有的
- 必胜态可以走向必败态:
- 若
⊕ i = 1 m S G ( i ) = a ≠ 0 " role="presentation" style="position: relative;">,显然我们可以通过某个DAG " role="presentation" style="position: relative;"> 上走一步,使得⊕ i = 1 m S G ( i ) = 0 " role="presentation" style="position: relative;">,也就是可以走向必胜态。因为我们最终的答案里面的每一个1 " role="presentation" style="position: relative;">,肯定都可以通过在某一个DAG " role="presentation" style="position: relative;"> 上走一步,使得答案除去当前起点的值导致最高位消掉,我们再走到含有剩下的1 " role="presentation" style="position: relative;"> 的点,这样加入贡献之后这些1 " role="presentation" style="position: relative;"> 也消掉了。
- 若
- 必败态只能走向必胜态:
- 显然无法移动一步,使得移动后的
S G " role="presentation" style="position: relative;"> 的异或和等于现在的异或和,也就是一定走向必胜态。
- 显然无法移动一步,使得移动后的
- 最终态是必败态:
-
Nim 游戏
Nim 游戏
-
题目描述:
- 有
n " role="presentation" style="position: relative;"> 堆石子,第i " role="presentation" style="position: relative;"> 堆石子有 " role="presentation" style="position: relative;"> 个,a i A " role="presentation" style="position: relative;"> 和B " role="presentation" style="position: relative;"> 每次可以从任意一堆中取出至少一个,不能取的人为输,请问谁有必胜策略。
- 有
-
题目分析:
-
显然每一堆石子都是一个子游戏,我们可以以石子数为
DAG " role="presentation" style="position: relative;">上的点,那么对于起点i " role="presentation" style="position: relative;"> 它的S G " role="presentation" style="position: relative;"> 显然等于 " role="presentation" style="position: relative;">,因为我们可以将图理解为如下样子:a i -

-
显然从底向上
S G " role="presentation" style="position: relative;"> 值依次为:0 , 1 , 2 , 3 " role="presentation" style="position: relative;">。注意最底端的节点代表0 " role="presentation" style="position: relative;"> 个石子。
-
例题
-
题目描述:
- 给定
n " role="presentation" style="position: relative;"> 行,第i " role="presentation" style="position: relative;"> 行的长度为 " role="presentation" style="position: relative;">,每行最左边有一颗白子,最右边有一颗黑子,a i A " role="presentation" style="position: relative;"> 可以移动白子,B " role="presentation" style="position: relative;"> 可以移动黑子,不能跨过对方的棋子,不能移动为输。
- 给定
-
题目分析:
- 我们棋子向边上走肯定不优,因为根据模仿的思想,假设白子向左移
x " role="presentation" style="position: relative;">,那么黑子也可以向左移x " role="presentation" style="position: relative;">,这样显然使得白子的局势不会更优。那么我们就考虑向中间走1 " role="presentation" style="position: relative;">,就理解为拿一颗石子,那么对于第i " role="presentation" style="position: relative;"> 行就是相当于有a i − 2 " role="presentation" style="position: relative;"> 个石子,也就是成为了我们的 Nim 游戏。
- 我们棋子向边上走肯定不优,因为根据模仿的思想,假设白子向左移
K-Nim 游戏
- 题目描述:
-
有
n " role="presentation" style="position: relative;"> 堆石子,第i " role="presentation" style="position: relative;"> 堆石子有 " role="presentation" style="position: relative;"> 个,a i A " role="presentation" style="position: relative;"> 和B " role="presentation" style="position: relative;"> 轮流进行操作,每次操作最多可以选择K " role="presentation" style="position: relative;"> 堆石子每堆石子拿至少一个,不能取的人为输,问谁有必胜策略。 -
定理: 将
" role="presentation" style="position: relative;"> 按二进制拆分,若每个二进制位上为a i 1 " role="presentation" style="position: relative;"> 的个数对K + 1 " role="presentation" style="position: relative;"> 取模等于0 " role="presentation" style="position: relative;">,则先手必败 -
证明:
- 最终态是必败态:显然最终态为必败态,因为已经全部取完了
- 必胜态可以走向必败态:
- 假设我们已经改变了
m " role="presentation" style="position: relative;"> 堆,使得第i " role="presentation" style="position: relative;"> 位之前的位都是K + 1 " role="presentation" style="position: relative;"> 倍数,那么就要找到一种方式使得第i " role="presentation" style="position: relative;"> 位也是K + 1 " role="presentation" style="position: relative;"> 的整数倍。显然对于考虑完的m " role="presentation" style="position: relative;"> 堆,我们可以任意的选择其第i " role="presentation" style="position: relative;"> 位是0 " role="presentation" style="position: relative;"> 或1 " role="presentation" style="position: relative;">,那么我们记不考虑这m " role="presentation" style="position: relative;"> 堆,剩下的堆里第i " role="presentation" style="position: relative;"> 位1 " role="presentation" style="position: relative;"> 的个数为s u m " role="presentation" style="position: relative;">。- 若
s u m ≤ K − m " role="presentation" style="position: relative;">,显然可以将这s u m " role="presentation" style="position: relative;"> 个1 " role="presentation" style="position: relative;"> 都变成0 " role="presentation" style="position: relative;">,然后将m " role="presentation" style="position: relative;"> 堆的1 " role="presentation" style="position: relative;"> 也都变成0 " role="presentation" style="position: relative;">。这样就相当于第i " role="presentation" style="position: relative;"> 位的总数为0 " role="presentation" style="position: relative;">,符合条件。 - 若
s u m > K − m " role="presentation" style="position: relative;">,我们在这m " role="presentation" style="position: relative;"> 堆里,选出K + 1 − s u m " role="presentation" style="position: relative;"> 堆变成1 " role="presentation" style="position: relative;">,这样两者一加就是K + 1 " role="presentation" style="position: relative;"> 个1 " role="presentation" style="position: relative;">,符合条件。化简一下就能得到K + 1 − s u m ≤ m " role="presentation" style="position: relative;">
- 若
- 假设我们已经改变了
- 必败态只能走向必胜态:
- 我们每次最多将某一个二进制位上的
1 " role="presentation" style="position: relative;"> 改变K " role="presentation" style="position: relative;"> 个,最少将某一个二进制位上的1 " role="presentation" style="position: relative;"> 改变1 " role="presentation" style="position: relative;">,因为我们最少改变一堆最多改变K " role="presentation" style="position: relative;"> 堆。因为我们原来的每一个二进制位都是K + 1 " role="presentation" style="position: relative;"> 的倍数,所以我们更改之后一定不都是,即一定是必胜态。
- 我们每次最多将某一个二进制位上的
-
例题
-
题目来源:
- [SDOI2011]黑白棋
-
题目分析:
这个题其实最麻烦的是证明 K-Nim 游戏,不过我证了
我们考虑如果初始状态给定,那么这就是一个 K-Nim 游戏,我们依旧将距离视为石子也就能发现了。然后根据 K-Nim 游戏的过程,我们可以想出一个显然巨难的状态:d p [ i ] [ j ] " role="presentation" style="position: relative;"> 表示前i − 1 " role="presentation" style="position: relative;"> 位取模后全部是0 " role="presentation" style="position: relative;">,当前放了j " role="presentation" style="position: relative;"> 个棋子的方案数,也就是先手必输的方案数。- 那么转移就是我们枚举第
i " role="presentation" style="position: relative;"> 位是d + 1 " role="presentation" style="position: relative;"> 的多少倍,然后也就是从这 " role="presentation" style="position: relative;"> 个堆里,选k 2 x ( d + 1 ) " role="presentation" style="position: relative;"> 个,也就是乘一个组合数 " role="presentation" style="position: relative;">,然后我们最后还要搞一下这些堆在哪里,也就是乘( k 2 x ( d + 1 ) ) " role="presentation" style="position: relative;">( n − i − k 2 k 2 )
反 Nim 游戏
- 题目描述:
- 有
n " role="presentation" style="position: relative;"> 堆石子,第i " role="presentation" style="position: relative;"> 堆石子的个数为 " role="presentation" style="position: relative;">,a i A " role="presentation" style="position: relative;"> 和B " role="presentation" style="position: relative;"> 轮流从一堆中选择至少一个石子,取到最后一个的人为输,问谁有必胜策略。
- 有
- 题目分析:
-
Anti-SG定理: 假设当所有子游戏的
S G " role="presentation" style="position: relative;"> 均为0 " role="presentation" style="position: relative;"> 时游戏结束,那么满足如下条件之一先手必胜:- 所有子游戏的
S G " role="presentation" style="position: relative;"> 的异或和不为0 " role="presentation" style="position: relative;">,且某个游戏的S G " role="presentation" style="position: relative;"> 值大于1 " role="presentation" style="position: relative;"> - 所有子游戏的
S G " role="presentation" style="position: relative;"> 的异或和为0 " role="presentation" style="position: relative;">,且所有游戏的S G " role="presentation" style="position: relative;"> 值都小于等于 1
- 所有子游戏的
-
证明:
- 我们定义如下的四个状态:
A " role="presentation" style="position: relative;">:S G " role="presentation" style="position: relative;"> 的异或和等于0 " role="presentation" style="position: relative;">,且存在某个游戏的S G " role="presentation" style="position: relative;"> 大于1 " role="presentation" style="position: relative;">(先手必败)B " role="presentation" style="position: relative;">:S G " role="presentation" style="position: relative;"> 的异或和等于0 " role="presentation" style="position: relative;">,且任意游戏的S G " role="presentation" style="position: relative;"> 小于等于1 " role="presentation" style="position: relative;">(先手必胜)C " role="presentation" style="position: relative;">:S G " role="presentation" style="position: relative;"> 的异或和不等于0 " role="presentation" style="position: relative;">,且存在某个游戏的S G " role="presentation" style="position: relative;"> 大于1 " role="presentation" style="position: relative;">(先手必胜)D " role="presentation" style="position: relative;">:S G " role="presentation" style="position: relative;"> 的异或和不等于0 " role="presentation" style="position: relative;">,且任意游戏的S G " role="presentation" style="position: relative;"> 小于等于1 " role="presentation" style="position: relative;">(先手必败)
- 最终态是必胜态:
- 因为最终态就是所有的子游戏
S G " role="presentation" style="position: relative;"> 值都为0 " role="presentation" style="position: relative;">,显然此时先手必胜
- 因为最终态就是所有的子游戏
- 必胜态可以走向必败态:
- 若满足状态
C " role="presentation" style="position: relative;">- 若只有一个游戏的
S G " role="presentation" style="position: relative;"> 大于1 " role="presentation" style="position: relative;">,那么显然可以将这个游戏的S G " role="presentation" style="position: relative;"> 值变成0 " role="presentation" style="position: relative;"> 或1 " role="presentation" style="position: relative;">,而我们S G " role="presentation" style="position: relative;"> 的异或和不为0 " role="presentation" style="position: relative;">,所以就走到了状态D " role="presentation" style="position: relative;">,必败态。 - 若有多个游戏的
S G " role="presentation" style="position: relative;"> 大于1 " role="presentation" style="position: relative;">,则可以使用类似S G " role="presentation" style="position: relative;"> 定理的推导过程,将S G " role="presentation" style="position: relative;"> 的异或和变为0 " role="presentation" style="position: relative;">,且存在某个游戏的S G " role="presentation" style="position: relative;"> 大于1 " role="presentation" style="position: relative;">,即走到了状态A " role="presentation" style="position: relative;">,必败态
- 若只有一个游戏的
- 若满足状态
B " role="presentation" style="position: relative;">- 若到达终止条件,即全是
0 " role="presentation" style="position: relative;">,则直接胜利并终止游戏 - 若某个游戏的
S G " role="presentation" style="position: relative;"> 值为1 " role="presentation" style="position: relative;">,则将这个值变为0 " role="presentation" style="position: relative;">,那么就到达了状态D " role="presentation" style="position: relative;">,必败态
- 若到达终止条件,即全是
- 若满足状态
- 必败态必须走向必胜态
- 若满足状态
A " role="presentation" style="position: relative;">- 若多个游戏的
S G " role="presentation" style="position: relative;"> 值大于1 " role="presentation" style="position: relative;">,显然只能转化为状态C " role="presentation" style="position: relative;">,必胜态。因为此时S G " role="presentation" style="position: relative;"> 的异或值不可能为0 " role="presentation" style="position: relative;">,而且也存在某个游戏的S G " role="presentation" style="position: relative;"> 值大于1 " role="presentation" style="position: relative;"> - 若只有一个游戏的
S G " role="presentation" style="position: relative;"> 值大于1 " role="presentation" style="position: relative;">,显然这种条件下不可能导致S G " role="presentation" style="position: relative;"> 的异或值不等于0 " role="presentation" style="position: relative;">
- 若多个游戏的
- 若满足状态
D " role="presentation" style="position: relative;">- 若将某一个
S G " role="presentation" style="position: relative;"> 值为1 " role="presentation" style="position: relative;"> 的游戏的S G " role="presentation" style="position: relative;"> 值改为0 " role="presentation" style="position: relative;">,显然对于S G " role="presentation" style="position: relative;"> 的异或和是取反的,因为原来异或的值只有1 " role="presentation" style="position: relative;"> 或0 " role="presentation" style="position: relative;">,异或之后依旧是1 " role="presentation" style="position: relative;"> 或0 " role="presentation" style="position: relative;">,这样就会到达状态B " role="presentation" style="position: relative;">,必胜态。 - 若将一个
S G " role="presentation" style="position: relative;"> 值为0 " role="presentation" style="position: relative;"> 的游戏的S G " role="presentation" style="position: relative;"> 值改为1 " role="presentation" style="position: relative;">,显然也是取反,会到达状态B " role="presentation" style="position: relative;">,必胜态. - 若将一个
S G " role="presentation" style="position: relative;"> 值为0 " role="presentation" style="position: relative;"> 的游戏的S G " role="presentation" style="position: relative;"> 值改为大于1 " role="presentation" style="position: relative;"> 的值,显然会到达状态C " role="presentation" style="position: relative;">,必胜态。因为此时显然S G " role="presentation" style="position: relative;"> 异或和不会等于0 " role="presentation" style="position: relative;">,而有的游戏的S G " role="presentation" style="position: relative;"> 值大于1 " role="presentation" style="position: relative;">。
- 若将某一个
- 若满足状态
- 我们定义如下的四个状态:
-
阶梯博弈
- 题目描述:
- 有
n " role="presentation" style="position: relative;"> 个阶梯呈编号升序排列,每个阶梯上有若干个石子,可行的操作是将一个阶梯上的石子移至少一个到前一个台阶。当没有可行操作时,即所有石子都被移动到了地面(第0 " role="presentation" style="position: relative;"> 号台阶)输。
- 有
- 题目分析:
-
定理: 阶梯博弈相当于奇数号台阶的 Nim 游戏,即当奇数号台阶上的石子数的异或和不为
0 " role="presentation" style="position: relative;"> 时,先手必胜。 -
证明:
- 最终态是必败态:
- 显然最终态是所有的石子数为
0 " role="presentation" style="position: relative;">,仅考虑奇数也是必败态
- 显然最终态是所有的石子数为
- 必胜态可以走到必败态:
- 我们一定可以把某一些石子放到偶数堆上,也就是能使得奇数堆的异或和为
0 " role="presentation" style="position: relative;">,即走到必败态
- 我们一定可以把某一些石子放到偶数堆上,也就是能使得奇数堆的异或和为
- 必败态必定走到必胜态:
- 显然我们无法通过调整石子数使得异或和保持
0 " role="presentation" style="position: relative;"> 不变,所以必败态必定会走到必胜态。
- 显然我们无法通过调整石子数使得异或和保持
- 最终态是必败态:
-
例题
- 题目描述
- 给定
n " role="presentation" style="position: relative;"> 堆石子,第i " role="presentation" style="position: relative;"> 堆石子的个数为 " role="presentation" style="position: relative;"> 个,保证初始石子数单调不降,a i A " role="presentation" style="position: relative;"> 和B " role="presentation" style="position: relative;"> 轮流操作,每次可以从某一堆石子中移走至少一个,需要满足在任意时刻石子数均单调不降,不能取的人输。
- 给定
- 题目分析
- 对石子数差分,然后倒序编号,也就相当于阶梯博弈的模型。