[复习资料]博弈论 - 应用篇

博弈论是我很久以前搞过的东西了,已经忘得差不多了,现将其整理成两篇博客:

本篇是应用篇。

经典游戏

Bash 博弈(巴什博奕):

\(n\) 个石子,每次最多取 \(m\) 个石子,不可操作者判负。

先手必败当且仅当 \((m+1)\mid n\) ,证明较简单,略。

Wythoff 博弈(威佐夫博弈):

两堆数量为 \(a\)\(b\) 的石子,每次可以选一堆取走任意多的石子,或者两堆取走相同多的石子,不可操作者判负。

这个直接参考这篇博客吧:《从威佐夫博弈看博弈论——一类有趣的整数集划分问题》

nimk 博弈:

若干堆石子,每次最多选择 \(k\) 堆最少选择 \(1\) 堆拿走任意多石子,不可操作者判负。

\(cnt(i)\) 表示每堆石子换算成二进制之后第 \(i\) 位为一的石子堆数量,打表发现,先手必败当且仅当 \(\forall i\in N,(k+1)\mid cnt(i)\)


证明:

相当于是要证明这两条结论,

一、当每一位 \(\bmod (k+1)\)\(0\) 时,不可能通过接下来的一次操作实现每一位 \(\bmod (k+1)\) 为0;

二、当存在一些位数 \(\bmod (k+1)\) 不为 \(0\) 时,可以通过一次操作实现每一位 \(\bmod (k+1)\)\(0\)

第一条结论的证明:首先,不可能只改变某一位的 \(0\) 或者是 \(1\) ,因为最多改变 \(k\) 堆,如果要满足,至少要改变 \(k+1\) 堆,那么要改变的那一位肯定是要改变 \(0\) 同时改变相同数量的 \(1\) 的,既然要改变 \(0\) ,说明比它高的某一位的 \(1\) 也要改变(因为每次改变石子数不会增大),既然比它高的那位 \(1\) 要改变,那么 \(0\) 也要改变相应的数量,这样推下去会发现不存在最高位,显然不符,所以结论成立。

第二条结论的证明:从高位往低位考虑,假设比当前考虑的位高的位中一共改变了 \(d\)\(1\) ,然后它们在当前位中有 \(x\) 个是 \(1\)\(y\) 个是 \(0\) ,那么有 \(d=x+y,d\le k\) ,当前位有 \((k+1)\times h+t(t\le k)\)\(1\) ,分类讨论:

  • 如果 \(t\le x\) 那么可以改变当前位的 \(t\)\(1\)
  • 如果 \(k+1-t\le y\) 那么可以改变当前位的 \(k+1-t\)\(0\)
  • 如果前两个都不满足,那么有 \(t>x\) 并且 \(k+1-t>y\) ,那么可以改变所有的 \(t\)\(1\) (包括可以改变的 \(x\)\(1\) ),此时总共改变了 \(t-x+d\) 堆石子, \(t-x+d=t+y<t+k+1-t=k+1\) ,所以此时并没有超过最多可以改变的石子堆数,可以满足要求。

staircase nim 博弈(阶梯博弈):

若干个阶梯,每个阶梯上有若干石子,每次在一个非 \(0\) 层阶梯上选择任意多石子移到下一层,不可操作者判负。

如果对方从第 \(i(i\ge 2)\) 层移动 \(k\) 个石子到第 \(i-1\) 层,我就可以从第 \(i-1\) 层移动 \(k\) 个石子到 \(i-2\) 层,所以如果只有偶数层有石子,那么此时先手是必败的,所以我们不妨认为所有偶数层都是第 \(0\) 层,于是乎从奇数层移动石子就相当于是丢掉石子,所以原问题就相当于是给奇数层的石子做 NIM 游戏。

一些简单思维游戏

参考自《算法竞赛入门经典训练指南》

chomp! 游戏:

有一个 \(n\times m\) 的棋盘,每次取走一个方格并拿走它右边和上面(右上)所有方格,不可操作者判胜

如果 \(n=m=1\) ,显然先手必败。

否则,不妨假如先手必败,那么去掉了 \((n,m)\) 的棋盘状态肯定是必胜,那么必然存在一种取法得到的状态是必败,而这种取法得到的最终结果先手第一步一定可以实现( \((n,m)\) 在所有格子的右上角),由此推出必败态可以转移到必败态,显然是错误的,所以得出答案是先手必胜。

约数游戏:

\(1\sim n\) 个数字,两个人轮流选一个数,并把它和它的所有约数擦去,不可操作者判负。

如果 \(n=1\) ,显然先手必胜。

否则用一样的方法,不妨假设先手必败,那么去掉了数字 \(1\) 的状态肯定是必胜,那么必然存在一种取法得到的状态是必败,而这种取法得到的最终结果先手第一步一定可以实现( \(1\) 是任何数的约数),由此推出必败态可以转移到必败态,显然是错误的,所以得出答案是先手必胜。

翻棋子游戏:

一个棋盘上每个格子有一个棋子,每次操作可以随便选一个朝上的棋子 \((x,y)\) (代表第 \(x\) 行第 \(y\) 列的棋子),选择一个形如 \((x,b)\) 或者 \((a,y)\) (其中 \(0\le b<y,0\le a<x\) )的棋子,然后把它和 \((x,y)\) 一起翻转,不可操作者判负。

每次操作可以看作是一次棋子的移动,那么每次操作要么就是减小 \(x\) ,要么就是减小 \(y\) ,由于横纵坐标相对是独立的,所以可以把横纵坐标分开考虑,把一个朝上的棋子 \((x,y)\) 看作是两堆石子,一堆石子的数量是 \(x\) ,另一堆是 \(y\) ,接下来就是做 NIM 游戏了。

但是这样还是有一个问题,就是可能会一次把两个棋子都由正面变成反面,但是这样对 NIM 游戏的分析是没有影响的,读者可以自己想一想为什么。

除法游戏:

有一个 \(n\times m\) 的矩阵,每个元素均为 \(2\sim 10000\) 之间的正整数,每次操作可以选择一行中的 \(1\) 个或多个大于 \(1\) 的整数,把它们中的每个数变成它的某个真因子,不可操作者判负。

对于某一个正整数 \(x\) ,我们究竟关心的是什么?不妨将 \(x\) 质因数分解为 \(p_1^{t_1}p_2^{t_2}\dots p_y^{t_y}\) ,如果把 \(x\) 变成了它的一个真因子,那么我们肯定是减小了至少一个 \(t_i\) ,也就是 \(\sum t_i\) 至少减小了 \(1\) ,由于 \(t\) 之间是没有任何区别的,所以我们关心的仅仅是 \(\sum t_i\) ,发现同一行的数与数之间也是没有区别的,所以可以把每行的数一起考虑,剩下的就是 NIM 游戏了。

\(\operatorname{SG}\) 函数和 \(\operatorname{SG}\) 定理的应用

由于作者很懒,所以打算丢几篇博客跑路。

一些 \(\operatorname{SG}\) 函数和 \(\operatorname{SG}\) 定理的应用的例子。

翻硬币游戏的一些拓展可以看这里。

无向图删边游戏看这里。

例题选讲

洛谷P3185 [HNOI2007]分裂游戏

Link:https://www.luogu.com.cn/problem/P3185

把第 \(i\) 个瓶子了的豆子看作是数量为 \(n-i-1\) 的一堆石子,那么每次操作相当于是将一堆石子变成数量比它少的两堆石子,由于 \(2\le n\le 21\) 很小,直接算出数量为 \(1\dots n-1\) 的石子的 \(\operatorname{SG}\) 函数值,用 \(\operatorname{SG}\) 定理,看异或起来是不是 \(0\) 就行了。

输出方案直接枚举选哪三个,判一下选完后的 \(\operatorname{SG}\) 函数值是否合法就行了。

洛谷P5675 [GZOI2017]取石子游戏

Link:https://www.luogu.com.cn/problem/P5675

博弈论加计数,考虑动规,记 \(dp_{i,j}\) 表示选出的石子堆包含编号为 \(i\) 的石子且除 \(i\) 以外的石子数量异或起来为 \(j\) 的方案数,若编号为 \(i\) 的石子堆数量为 \(a_i\) ,那么答案便是 \(\sum_{i=1}^{n}\sum_{j=a_i}dp_{i,j}\) (此时 Alice 的第一次操作就不可以使得 Bob 拿到必败态了),记值域最大为 \(x\) ,时间复杂度 \(\mathcal O(n^2x)\)

洛谷P3480 [POI2009]KAM-Pebbles

Link:https://www.luogu.com.cn/problem/P3480

相当于是对相邻两堆石子的差做阶梯 NIM 游戏。

poj1740 A New Stone Game

Link:http://poj.org/problem?id=1740

题意就是给定 \(n\) 堆石子,每次选择一堆数量大于 \(0\) 的石子,然后丢掉这堆石子中至少一颗石子(可以更多),然后从这堆石子中选任意多的石子任意分配到其他数量非 \(0\) 的石子处,无法操作者算输。

用手玩和打表等方法可以猜出以下结论(其实我也没有好方法找结论的):

\(n\) 为偶数且恰好可以分成 \(n/2\) 份使得每份的两堆数量相等,先手必败;否则先手必胜。

证明:

必胜态至少可以转移到一种必败态:

\(n\) 为奇数,排序后可以保证 \(a_n>(a_{n-1}-a_{n-2})+(a_{n-3}-a_{n-4})+\dots+(a_2-a_1)\) ,直接把 \(a_{n-2k}\) 变成 \(a_{n-2k+1}\) ,剩下的丢掉就可以变成必败态了;

\(n\) 为偶数,排序好可以保证 \(a_n>(a_{n-1}-a_{n-2})+(a_{n-3}-a_{n-4})+\dots+(a_3-a_2)+a_1\) (这个解释一下,令 \(a_0=0\) ,因为 \(a_n=\sum_{i=0}^{n-1}(a_{i+1}-a_i)=\sum_{i=0}^{\frac{n}{2}-1}(a_{2i+1}-a_{2i})+\sum_{i=0}^{\frac{n}{2}-1}(a_{2i+2}-a_{2i+1})\) ,由于有 \(\sum_{i=0}^{\frac{n}{2}-1}(a_{2i+2}-a_{2i+1})>0\) ,所以 \(a_n>\sum_{i=0}^{\frac{n}{2}-1}(a_{2i+1}-a_{2i})\) ),直接把 \(a_{n-2k}\) 变成 \(a_{n-2k+1}\) ,剩下的拿到 \(a_1\) 就变成必败态了。

必败态无论如何都不可能变成必败态,这个读者可以自己证明一下。

\(n=0\) 时,也满足必败态的要求。

所以原结论成立。

洛谷P2599 [ZJOI2009]取石子游戏

Link:https://www.luogu.com.cn/problem/P2599

此神仙题不可做(确信

\(L_{l,r}\) 表示如果在 \(l\)\(r\) 这个区间左边添上一堆石子数量为 \(L_{l,r}\) 的石子堆时先手必败,记 \(R_{l,r}\) 表示如果在 \(l\)\(r\) 这个区间右边添上一堆石子数量为 \(R_{l,r}\) 的石子堆是先手必败。

首先证明 \(L_{l,r}\)\(R_{l,r}\) 唯一,假设 \(L_{l,r}\) 存在两个取值 \(x,y(x<y)\) ,那么当添上去的石子堆数为 \(y\) 时先手可以把 \(y\) 拿成 \(x\) ,换成后手拿,此时后手必败,先手必胜,与假设矛盾(当添上去石子数为 \(y\) 时先手必败),所以 \(L_{l,r}\) 唯一, \(R_{l,r}\) 同理。

接下来证明 \(L_{l,r}\)\(R_{l,r}\) 存在,假设 \(L_{l,r}\) 不存在,即无论在左边添上去的石子数量为多少,先手都必胜,假设左边添上 \(x\) ,那么先手必然不会拿左边的这个 \(x\) ,因为拿了后还是必胜态,所以先手会从右边拿,那么在拿完后无论 \(x\) 为多少都是必败态,后手如果拿了左边的 \(x\) 得到的还是必败态,与“无论 \(x\) 为多少都是必败态矛盾”,所以 \(L_{l,r}\) 存在, \(R_{l,r}\) 同理。

再证明一些结论吧:

引理一:

\(L_{l,r}=0\) ,那么 \(R_{l,r}=0\)\(R_{l,r}=0\) 时同理)。因为 \(L_{l,r}=0\) ,局面为 \((0,[l,r])\)\(([l,r])\) 时先手必败。假设 \(R_{l,r}\ne 0\) ,那么先手可以直接把右边拿成 \(0\) ,此时局面变成 \(([l,r])\) ,后手操作,所以后手必败,与原先假设先手必败矛盾,所以结论成立。

考虑 \(L_{l,r}\) 如何转移( \(R_{l,r}\) 同理):

方便起见,记 \(L=L_{l,r-1},R=R_{l,r-1},x=a_r\)

\(\mathsf{Case 1: x=R}\)

\(L_{l,r}=0\) 。相当于原本就是必败态。

\(\mathsf{Case 2: x<L,x<R}\)

\(L_{l,r}=x\) 。由必胜必败态的定义可以知道当石子数量为 \((0\sim L-1,[l,r-1])\) 或者 \(([l,r-1],0\sim R-1)\) 时先手必胜。可以在左边添上一堆数量为 \(x\) 的石子,此时先手从哪一边拿石子,后手就从另一边拿相同数量的石子,此时必然会有一堆先被拿完,拿完后操作方变成后手,局面变为 \((0\sim L-1,[l,r-1])\)\(([l,r-1],0\sim R-1)\) ,后手必胜。

\(\mathsf{Case 3: R<x\le L}\)

\(L_{l,r}=x-1\) 。假设先手拿左边,左边剩 \(y\) 个石子:若 \(y<R\) ,后手可以直接把右边拿成 \(y\) ,变成 \(\mathsf{Case 2}\) 里面的情况;若 \(y\ge R\) ,后手把右边拿成 \(y+1\) ,回到 \(\mathsf{Case 3}\) 。假设先手拿右边,右边剩 \(y\) 个石子:若 \(y=R\) ,如果 \(R\ne 0\) ,左边剩余石子数必然大于 \(0\) ,后手直接把左边拿完,变成 \(\mathsf{Case 1}\) ,否则 \(R=0\) ,由引理一得到 \(L=0\) ,不存在 \(R<x\le L\) ,即该情况不存在;若 \(y<R\) ,那么先手上一步至少拿了两个石子( \(y\ge R+1\to y\le R-1\) ),左边石子数量必然大于 \(y\) ,后手可以把左边拿成 \(y\) ,变成 \(\mathsf{Case 2}\) ;若 \(y>R\) ,后手把左边拿成 \(y-1\) ,回到 \(\mathsf{Case 3}\)

\(\mathsf{Case 4: L\le x<R}\)

\(L_{l,r}=x+1\) 。这个和 \(\mathsf{Case 3}\) 类似,建议读者先自己想想。假设先手拿左边,左边剩 \(y\) 个石子:若 \(y=L\) ,如果 \(L\ne 0\) ,右边剩余石子数必然大于 \(0\) ,后手直接把右边拿完,变成 \(\mathsf{Case 1}\) ,否则 \(L=0\) ,由引理一得到 \(R=0\) ,不存在 \(L\le x<R\) ,即该情况不存在;若 \(y<L\) ,那么先手上一步至少拿了两个石子( \(y\ge L+1\to y\le L-1\) ),右边石子数量必然大于 \(y\) ,后手可以把右边拿成 \(y\) ,变成 \(\mathsf{Case 2}\) ;若 \(y>L\) ,后手把右边拿成 \(y-1\) ,回到 \(\mathsf{Case 4}\) 。假设先手拿右边,右边剩 \(y\) 个石子:若 \(y<L\) ,后手可以直接把左边拿成 \(y\) ,变成 \(\mathsf{Case 2}\) ;若 \(y\ge L\) ,后手把左边拿成 \(y+1\) ,回到 \(\mathsf{Case 4}\)

\(\mathsf{Case 5: x>L,x>R}\)

\(L_{l,r}=x\) 。分类讨论后不难变成以上四种 \(\mathsf{Case}\) ,请读者自行思考。

\(R_{l,r}\)\(L_{l,r}\) 的求解类似,不再赘述。

最后只要判断一下 \(L_{2,n}\) 是否等于 \(a_1\) 就可以判断胜负了。

题单

类型和提示都写在下面了,可以选择自己想做的做一下。

求必胜必败态类:

hdu1846 Brave Game (威佐夫博弈):http://acm.hdu.edu.cn/showproblem.php?pid=1846

hdu2516 取石子游戏 (斐波那契博弈):http://acm.hdu.edu.cn/showproblem.php?pid=2516

hdu1849 Rabbit and Grass (nim游戏变体):http://acm.hdu.edu.cn/showproblem.php?pid=1849

hdu1730 Northcott Game (nim游戏变体):http://acm.hdu.edu.cn/showproblem.php?pid=1730

poj1740 A New Stone Game (新题目):http://poj.org/problem?id=1740

poj1704 Georgia and Bob (nim游戏变体):http://poj.org/problem?id=1704

luoguP3480 [POI2009]KAM-Pebbles (nim游戏变体):https://www.luogu.com.cn/problem/P3480

luoguP4018 Roy&October之取石子 (神仙题目):https://www.luogu.com.cn/problem/P4018

luoguP4860 Roy&October之取石子II (神仙题目):https://www.luogu.com.cn/problem/P4860

UVA1378 A Funny Stone Game (SG函数应用):https://www.luogu.com.cn/problem/UVA1378

luoguP3185 [HNOI2007]分裂游戏 (SG函数应用,同A Funny Stone Game):https://www.luogu.com.cn/problem/P3185

luoguP2594 [ZJOI2009]染色游戏 (一类翻硬币游戏的二维扩展):https://www.luogu.com.cn/problem/P2594

luoguP2599 [ZJOI2009]取石子游戏 (神仙题目):https://www.luogu.com.cn/problem/P2599

poj3710 Christmas Game (无向图删边游戏弱化版:带环树):http://poj.org/problem?id=3710

IPSC 2003 Problem G – Got Root? (无向图删边游戏标准版):https://ipsc.ksp.sk/2003/real/problems/g.html

求方案数类:

luoguP5675 [GZOI2017]取石子游戏 (nim游戏):https://www.luogu.com.cn/problem/P5675

luoguP2490 [SDOI2011]黑白棋 (nimk游戏变体):https://www.luogu.com.cn/problem/P2490

特殊类:

luoguP3210 [HNOI2010]取石头游戏 (神仙题目):https://www.luogu.com.cn/problem/P3210

博弈论重点是思考的方式。

参考博客:

《【算法】 博弈论入门笔记》:https://www.mina.moe/archives/5564

《【算法】 博弈论》:https://www.mina.moe/archives/5533

《愚者千虑,必有一得——博弈论》:https://blog.csdn.net/kyleyoung_ymj/article/details/51494139

《博弈论变形》:https://www.luogu.com.cn/blog/wageneral/bo-yi-lun-bian-xing

《从威佐夫博弈看博弈论——一类有趣的整数集划分问题》:https://www.luogu.com.cn/blog/55201/zong-wei-zuo-fu-bo-yi-kan-bo-yi-lun-yi-lei-you-qu-di-zheng-shuo-ji-hu

结尾

本篇博客主要讲了一些博弈论的简单应用并整理了相关题单。

希望对你有帮助。

posted @ 2020-09-09 20:57  xiaolilsq  阅读(564)  评论(0编辑  收藏  举报