浅谈博弈论
Bash游戏
这很简单,手玩两组样例就找到规律了。
只有一堆石子,个数为 \(n\) 个,两名玩家轮流在石子堆中拿石子,每次至少取 \(1\) 个,至多取 \(m\) 个,最后一个取走石子的玩家为胜者。
实际上,\((m+1)\ |\ n\) 时必胜。
Nim游戏
\(n\) 堆物品,每堆 \(a_i\) 个,两个玩家轮流取走任意一堆的任意个物品,但不能不取,取走最后一个物品的人获胜。
需要读者自行掌握 \(N/P-position\) 证明法。
请注意
结论:\(\bigoplus_{i=1}^n a_i = 0\) 后手必胜,反之先手必胜。
证明:
- \(P \to N\):当 \(\bigoplus_{i=1}^n a_i = 0\),如果取一个数变为 \(a_i^{\prime}\),此时若有 \(\bigoplus_{i=1}^n a_i = 0\),则 \(a_i = a_i^{\prime}\),矛盾。
- \(N \to P\):\(\bigoplus_{i=1}^n a_i = k\) 此时需要将 \(k\) 变为 \(0\),只需找到一个 \(a_i > a_i \oplus k\) 即可,即 \((a_i >>\log_2 k)\&1==1\)。
证毕。
该题考察设计 \(Nim\) 游戏的方案,属于是加强版模板。
NimK
\(NimK\) 实际上是 \(Nim\) 游戏的推广,一般情况。
\(n\) 堆物品,每堆 \(a_i\) 个,两个玩家轮流取走任意 \(k\) 堆的任意个物品,但不能不取,取走最后一个物品的人获胜。
记 \((x)_i\) 为二进制下第 \(i\) 位。
结论:\(\forall s,\Big(\sum_{i=1}^n (a_i)_s\Big) \pmod{k+1} = 0\) 先手必败。
证明:
-
\(P \to N\):当 \(\forall s,\Big(\sum_{i=1}^n (a_i)_s\Big) \pmod{k+1} = 0\),如果将一个二进制位变为 \(0\),此时必须操作\(k+1\) 次,但因为只能操作 \(k\) 堆石子,矛盾。
-
\(N \to P\):\(\forall s,\Big(\sum_{i=1}^n (a_i)_s\Big) \pmod{k+1} = b\) 此时需要将 \(k\) 变为 \(0\),大多数人的证法是错误的,因为那样讨论可能超过 \(k\) 组这里补充正确证法。
假设我们枚举每一位,如果 \(\Big(\sum_{i=1}^n (a_i)_s\Big) \pmod{k+1} = b_s\),需要改变。
我们设除去已经更改的 \(m\) 堆,剩下堆 \(i\) 位上 \(1\) 的总和为 \(sum\)。
若 \(sum\le k-m\),此时我们可以将堆上的 \(1\) 全部拿掉,让后让拿 \(m\) 堆得 \(i\) 位全部为 \(0\)。
若 \(sum > k-m\),此时我们可以在 \(m\) 堆中选 \(k+1-sum\) 堆,让后让 \(i\) 位全部为 \(1\),此时一定有 \(k+1-sum<k+1-(k-m)<m+1\),故可以选到。
证毕。
Staircase Nim
翻译过来叫做阶梯 \(Nim\)。
\(n\) 堆石子,编号 \(1\) 到 \(n\)。初始第 \(n\) 堆石子数为 \(a_i\)。轮流取石子,每次从任意一堆拿走任意个放在前面的那一堆,第 \(1\) 堆拿走后丢弃,最后一个取走石子的玩家为胜者。
结论:相当于只有奇数编号石子堆的 \(Nim\) 游戏。
证明:
- 首先我们一定可以在最开始时将局势调整为 \(P-position\)。
- 那么往后如果后手移动为奇到偶,相当于继续做 \(Nim\)。
- 如果后手为偶到奇,我们就将移动的这些石子又移到偶去。
证毕。
P3480 [POI 2009] KAM-Pebbles - 洛谷
模板题,做一下差分即可变成反过来的 \(Staircase\ Nim\)。
Wythoff游戏
有两堆石子,数量任意,可以不同。
游戏开始由两个人轮流取石子。
游戏规定,每次有两种不同的取法:一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。
最后把石子全部取完者为胜者。
显然, \((0,0)\) 时先手必败。接下来的一个必败情况就是 \((1,2)\)。再往下,就得到 \((3,5)\)。然后是 \((4,7),(6,10),(8,13),(9,15),...\)。
关键观察:恰好覆盖 \(N^+\),且精确覆盖,差值也有这个性质。
\(\textbf{Lemma}\) \(Beatty(1926)\). 对于两个正无理数 \(x,y\),若其满足 \(\dfrac{1}{x}+\dfrac{1}{y}=1\),令两个集合 \(P=\left\{ p|p=\lfloor nx\rfloor,n \in N^+ \right\},Q=\left\{ q|q=\lfloor my\rfloor,m \in N^+ \right\}\),其中 \(N^+\) 为正整数集。则有 \(P \cap Q=\varnothing,P \cup Q=N^+\)。
考虑反证:
-
如果存在一个 \(k \in N^+\) 使得 \(k\in P,k\in Q\),设 \(k < nx < k+1\),\(k < my < k+1\)。
转换得到 \(\dfrac{n}{k+1} < \dfrac{1}{x} < \dfrac{n}{k}\),\(\dfrac{m}{k+1} < \dfrac{1}{y} < \dfrac{m}{k}\)。
相加,\(\dfrac{n+m}{k+1} < 1 < \dfrac{n+m}{k}\)。
有 \(k < n+m < k+1\),矛盾。
-
如果存在一个 \(k \in N^+\) 使得 \(k \notin P,k \notin Q\),设 \(nx < k < k+1 < (n+1)x\),\(my < k < k+1 < (m+1)y\)。
转换得到 \(\dfrac{n}{k} < \dfrac{1}{x} < \dfrac{n+1}{k+1}\),\(\dfrac{m}{k} < \dfrac{1}{y} < \dfrac{m+1}{k+1}\)。
相加,\(\dfrac{n+m}{k} < 1 < \dfrac{n+m+2}{k+1}\)。
有 \(k-1 < n+m < k\),矛盾。
证毕。
结论:假设石子数为 \(a,b\ (a\le b)\),\(a=\Big\lfloor\dfrac{\sqrt{5}+1}{2}\Big\rfloor\times(b-a)\) 时该状态为必败状态。
证明:
- \(P \to N\):如果只从一堆里面取,那么由于每个数只出现一次,一定不会又进入 \(P\) 状态,如果从两堆里面选,差值不变,显然一定不会进入 \(P\) 状态。
- \(N \to P\):显然成立,一定有方法转换,设当前 \((a_i,b_i)\),找到那组差值 \(b_i-a_i\) 的局势 \((a_j,b_j)\),若 \(a_j<a_i\) 则直接选两堆,\(a_j>a_i\),则 \(a_i\) 在之前局势一定出现过,设为 \((a_i,b_i^{\prime})\),一定有 \(b_i>b_i^{\prime}\),我们改变 \(b_i\) 即可。
注意,我们只根据观察到的性质进行了证明这个规律就是 \(P\) 状态,但是没有办法判断一个状态是否属于 \(P/N\) 状态。
因此现在使用 \(\textbf{Lemma}\)。
我们需要找到 \(x,y\),使得 \(\dfrac{1}{x}+\dfrac{1}{y}=1\),并且使得状态 \((a_i,b_i)\) 中 \(a_i \in P,b_i \in Q\)。
根据我们找到的性质,列方程组:\(\begin{cases} \dfrac{1}{x}+\dfrac{1}{y}=1 \\ \lfloor n \times x \rfloor + n = \lfloor n \times y \rfloor \end{cases}\)。
因为 \(n \in N^+\),如果 \(y \ne x + 1\),一定存在 \(n\),使得方程不成立。
所以 \(y = x+1\),进而得到 \(\begin{cases} \dfrac{1}{x}+\dfrac{1}{y}=1 \\ y = x+1 \end{cases}\)。
带入解得 \(\begin{cases} x = \dfrac{1 \pm \sqrt{5}}{2} \\ y = \dfrac{3 \pm \sqrt{5}}{2} \end{cases}\),根据 \(\textbf{Lemma}\) 中的限制舍负。
通过构造,我们找到了 \(x = \phi,y = \phi + 1\)。
\(P=\left\{ p|p=\lfloor n\phi\rfloor,n \in N^+ \right\},Q=\left\{ q|q=\lfloor m(\phi+1)\rfloor,m \in N^+ \right\}\)。
在 \(n=m\) 的情况下,有 \(p + n = q\)。
此时 \(p = \lfloor n\phi \rfloor,q = \lfloor n\phi \rfloor + n\)。
此时 \(\lfloor (q-p) \times \phi \rfloor = p\)。
证毕。
Fibonacci游戏
有一堆个数为 \(n,n \ge 2\) 的石子,游戏双方轮流取石子,规则如下:
- 先手不能第一次全取完,至少取 \(1\) 颗。
- 之后每次取的石子个数至少为 \(1\),至多为对手所取的石子数的 \(2\) 倍。
还是最后一个取走石子的为赢家。
\(\textbf{Lemma}\) \(Zeckendorf(1939)\). 任何正整数都可以表示成若干个不连续的斐波那契数之和。
证明:
若 \(n\) 为斐波那契数,显然两个数之和的分解形式。
若 \(n\) 不为斐波那契数,取 \(fib_i\),使得 \(fib_i<n<fib_{i+1}\),有 \(n-fib_i<n\) 可以分解。
那么此时 \(n-fib_i < fib_{i+1}-fib_i = fib_{i-1}\),一定取不到 \(fib_{i-1}\),不连续。
证毕。
结论:如果正整数 \(n\) 为斐波那契数,则先手必败。
证明:
设 \(n = fib_i\),我们有 \(n = fib_{i-1} + fib_{i-2}\)。
若第一步的个数超过 \(fib_{i-2}\),因为 \(fib_{i-1} = fib_{i-2} + fib_{i-3}<2 \times fib_{i-2}\),\(n < 3\times fib_{i-2}\)。
若第一步的个数不超过 \(fib_{i-2}\),因为我们有 \(fib_i = fib_{i-1} + fib_{i-2}\),所以剩下的一定不是斐波那契数。
这时局势变为对手的非斐波那契,对手只需再取成斐波那契,便分解成更小的子问题。
根据第二归纳法,我们只需证明 \(n = 2\) 时的情况,此时先手拿 \(1\) 个,后手赢。
证毕。
结论:如果 \(n\) 不为斐波那契数,则将其用齐肯多夫表示法表示后,最小的那一堆个数即为答案。
证明:
\(n=f_1+f_2+...+f_k\)
先手取完最小的那一堆(即 \(f_k\))后,根据齐肯多夫定理,\(f_{k-1}>2\times f_k\),于是后手无法一次性取完次小的那一堆。再根据斐波那契先手必败,次小的一堆的最后一块石子一定还是由先手取到,于是先手一定能取到最大的那一堆的最后一块,即整堆石子的最后一块。
补充:事实上,已经有人证明,只有唯一一种必胜策略。
每次询问第一次选不超过 \(k\) 个,\(1 \sim n\) 有多少情况必胜。
设 \(Zeckendorf\) 分解出的最小数为 \(p_i\),求 \(\sum_{i=1}^n [p_i \le k]\)。
数位 \(DP\) 即可。
有向图游戏与 SG 函数入门
给定一个有向无环图,图中有一个唯一的起点,在起点上放有一枚棋子。两名玩家交替地把这枚棋子沿有向边进行移动,每次可以移动一步,无法移动者判负。该游戏被称为有向图游戏。
任何一个公平组合游戏都可以转化为有向图游戏。具体方法是,把每个局面看成图中的一个节点,并且从每个局面向沿着合法行动能够到达的下一个局面连有向边。 转化为有向图游戏,也称绘制了它的博弈状态图(简称博弈图或游戏图)。
而对于有向图游戏中的每一个节点,都代表当前子游戏的状态。
在有向图游戏中,对于每个节点 \(x\),设从 \(x\) 出发共有 \(k\) 条有向边,分别到达节点 \(y_1,y_2,\dots,y_k\)。
定义 \(SG(x)\) 表示为 \(x\) 的后继节点 \(y_1,y_2,\dots,y_k\) 的 \(SG\) 函数值所构成的集合再执行 \(\operatorname{mex}\) 运算的结果,即:\(SG(x) = \operatorname{mex}({SG(y1),SG(y2),\dots,SG(yk)})\)。
特别的,整个有向图游戏 \(G\) 的 \(SG\) 函数值定义为有向图起点 \(s\) 的 \(SG\) 函数值,即 \(SG(G)=SG(s)\)。
其中 \(SG(x) = 0\) 时,代表 \(P-position\),如果 \(SG(x) \ne 0\),说明存在 \(SG(y_i) = 0\),因此是必胜点。
\(\textbf{SG Theory}\). 如果一个有向图游戏有多个起点,\(G_1,G_2,\dots,G_k\),那么 \(SG(G) = \bigoplus_{i=1}^k SG(G_i)\)。
\(SG\) 定理阐述了在多个选择的时候可以怎么做,综上所述,所有的公平组合游戏均可以使用 \(SG\) 函数求解。
有向图游戏与 SG 函数进阶
为什么 \(SG\) 函数一定能解决所有的公平组合游戏?
策梅洛定理:在有限步、无随机性、完全信息的两人博弈中,必然存在一个确定的最优策略,使得先手或后手一方有必胜策略,或双方至少能强制平局。
这个定理看起来十分简单,如果用 \(SG\) 函数渗透,可以比较严谨的证明。
但是你越想会觉得越震撼就是了。
现在,我们考虑使用 \(SG\) 函数建模 \(Nim\) 游戏。
因为你可以取任意多个,有 \(SG(x) = x\)。
那么现在十分显然:\(SG(G) = \bigoplus_{i=1}^k SG(G_i) = 0\) 时必胜。
最后再贴一个有趣的结论:这里给出一个性质,由 \(\operatorname{mex}\) 得出某个状态的 \(SG\) 值一定在 \(O(\sqrt{m})\) 以内,其中 \(m\) 为有向图游戏的边数。(很美妙,自己证啦~)
有向图游戏与 SG 函数应用
咕咕咕~
反常游戏
说实话不该列这个专题的,但毕竟太容易考了。
这类游戏的结论远没有正常游戏那么优雅,大力 \(SG\) 就行了。
咕咕咕~
\(Exercise\):

浙公网安备 33010602011771号