博弈论
目录博弈论小记 - command_block 的博客 - 洛谷博客 (luogu.com.cn)
公平组合游戏
有个游戏状态 \(G\) ,玩家可以把状态转移成 \(G'\) ,满足转化关系没有环
有一些状态为终止状态,走到终止状态为负
- 两个玩家面对同一个状态 \(G\) ,其可能的目标状态集合是相同的。(决策公平)
- 两个玩家都知道有关游戏的所有信息。(无隐藏信息)
- 不包含随机成分。(无随机过程)
- 只有赢或输,没有平局。(无平局)
\(N/P\)
终止态是必败态(记为P),转移中有一个必败态的为必胜态(记为N)
\(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(S)=0\) 是必败态的充要
\(SG\) 和
\[SG(A+B)=SG(A)\ {\rm xor}\ SG(B) \]表示两个并列的博弈的 \(SG\)
Nim游戏
Easy Game
有 \(N\) 堆石子,两个人轮流操作,每次可以把某一堆石子拿去若干。没有石子定义为终止态。
定义 \(SG(0)=0\) ,由于\(SG(k)\) 可以转移到 \(SG(0)...SG(k-1)\) ,可知 \(SG(k)=k\)
那么用 \(SG\) 和,即是把全部数量异或起来
Take Away
有 \(m\) 个石堆,每堆有包含 \(a_i\) 个石子,每一轮可以从某堆取走 \(1 ... k\) 个石子,不能操作者负。
当 \(x\le k\) , \(SG(x)=x\)
当 \(x=k+1\) , \(SG(k+1)=0\)
手模可得 \(SG(n)=n\mod (k+1)\)
然后求 \(SG\) 和即可
Hungergame
有 \(m\) 个箱子,每个箱子中都有若干石子,双人博弈,每一轮可以采取下列操作之一:
- 打开若干个箱子
- 将某个箱子中的石子取出若干。
一次可以打开多个箱子,所以游戏不独立
如果所有箱子都打开了,就是esay game了
考虑先手打开了异或和为0的箱子(且为最大的,即无法再打开异或和为0的箱子),那么对手只能回P态的Nim+箱子,只要把P态的Nim改为N态,先手就必胜了
所以用线性基维护一下,如果有异或和为0的集合,先手必胜
Staircase
有 \(n\) 层阶梯,编号 \(1 ...n\) ,每层阶梯上有一些石子。
两个玩家轮流操作,每次操作可以将第 \(i\) 层阶梯上若干(至少一个)石头放到 \(i-1\) 层阶梯上,第 0 层阶梯即为地板。
无法移动的玩家失败
考虑偶数层的石头,先手操作了,后手可以再次操作,不影响先后手关系
而奇数层只要一步就可以移动到偶数层,所以等价于只有奇数层的Nim
Lasker's Nim
每次可以从一堆中拿走若干石子,或者将一堆分裂成两个非空石堆。
朴素的 \(n^2\) 求出 \(SG\) 函数
翻硬币问题
例题
P4363[九省联考2018]一双木棋chess
题目描述
棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束
落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且这个格子的左侧及上方的所有格子内都有棋子
每个格子有 \(a_{i,j},b_{i,j}\) ,分别表示先手和后手放在这个格子的得分
两人都希望自己的得分减对手得分尽可能大,问最后的分数
solution
可以发现落子的状态是一个轮廓线,所以考虑用01表示,于是就是 \(\binom{n+m}{n}\) 的状态表示出轮廓线,然后记搜即可
P5363 [SDOI2019] 移动金币
题目大意
现在长度为 \(n\) 的数轴,上面有 \(m\) 颗棋子(每个位置最多一颗棋子),每次可以选择一个左边为空的棋子向左移动若干个格(经过的格子都是空),两人轮流操作,不能操作者为负。问有多少种开局,有先手必胜策略
solution
可以想到转化成阶梯Nim,把每个点右边的空位数看作石子数,那么向右移动 \(x\) 格就是把 \(x\) 个石头扔到左边一堆里,所以就是 \(n-m\) 个石头,放在 \(m+1\) 个堆里,使得偶数堆的异或和不为0的方案数(因为最右边可以有一个堆直接在地板,它是第一堆)
然后就是计数题了,非0的不好算,于是考虑总方案-为0的方案
从二进制的高到低位考虑,设 \(f_{i,j}\) 表示到二进制下第 \(i\) 位,用了 \(j\) 个石头的方案数,转移我们就枚举当前位有 \(k(k \% 2=0)\) 个位置填了 \(2^i\) 那么转移就是(令 \(q=\lfloor \frac {m+1}2 \rfloor\))
\[f_{i,j}=\sum_{k\%2=0} f_{i+1,j-k2^i}\binom{q}{k} \]\[ans=\binom{n}{m}-\sum f_{q,i}\binom{n-i-q}{m-q} \]最后的组合数是插板法
P3185 [HNOI2007] 分裂游戏
题目大意
有 \(n\) 堆石子,每堆有 \(a_i\) 个石子,每次操作一次选定 \(i<j\le k\) 且第 \(i\) 堆有石子,从第 \(i\) 堆拿出一个石子,再向第 \(j\) 和 \(k\) 堆各放一个石子(若 \(j=k\) 就放两个),无法操作为负,问必胜策略的第一步和方案数
solution
可以想到把每堆石子并不是独立游戏,但每颗石子是独立游戏。考虑一个在第 \(i\) 堆的石子,它会分裂成两个编号比它大的石子。于是考虑反过来,在第 \(i\) 堆的石子编号为 \(n-i\) ,那么它将分类成两个编号比他更小的的石子
所以我们可以 \(n^3\) 预处理 \(SG\) 函数,然后直接 \(n^3\) 算方案数
标签:箱子,博弈论,游戏,格子,Nim,石子,SG,小记 From: https://www.cnblogs.com/zhy114514/p/18258894