博弈论

博弈论的简单总结:


1. 巴什博弈:

一堆石子,共 \(n\) 个,双方可以取 \(1\) ~ \(m\) 个石子,先取完者获胜(无法操作者败)

显然,如果场上只有 \(m+1\) 个石子,那么先手必败

那我们可以思考,如果场上石子有 \(k(m+1)+r\) 个石子,那先手一定可以取 \(r\) 个,如果后手取 \(k\) 个,那先手就取 \((m+1)-k\) 个,最后 \(m+1\) 的局面就是后手面对了

因此,我们就可以得到结论:

\((m+1)|n\) ,则先手必败

否则,先手必胜


2. 威佐夫博弈:

两堆石子,你可以从一堆里面取走任意颗石子,也可以从两堆中取走相同石子,先取完者胜

先来证明一下beatty定理

  • \(a, b\) 是正无理数,且 \(\frac{1}{a}+\frac{1}{b}=1\),令 $P= \lfloor{na}\rfloor $ ,$Q= \lfloor{mb}\rfloor $ ,\(n,m \in Z^+\) ,那么 \(P\)\(Q\) 就是正整数的划分(即 $P \cap Q= \emptyset $ ,$P \cup Q= Z^+ $)

证明:

  1. 任意一个正整数在 \(P\)\(Q\) 最多出现一次

    • 因为 \(\frac{1}{a}+\frac{1}{b}=1\) ,所以可知 \(a,b>1\)

    • 所以 $\lfloor{na}\rfloor $ 各不相同

  2. $P \cap Q= \emptyset $(反证法)

    • \(k\) 是$P \cap Q $ 中的一个整数

    • 则有 \(k<na<k+1\)\(k<mb<k+1\)

    • \(\frac{n}{k+1}<\frac{1}{a}<\frac{n}{k}\)\(\frac{m}{k+1}<\frac{1}{b}<\frac{m}{k}\)

    • 加起来就是:\(\frac{n+m}{k+1}<1<\frac{n+m}{k}\)

    • 再移项: \(k<n+m<k+1\)

    • 但显然,\(n,m\) 都是正整数,所以矛盾

  3. $P \cup Q= Z^+ $ (反证法)

    • 同理,令 \(k\)不属于 $P \cup Q $ 中的一个整数

    • 那么就有 \(\lfloor{na}\rfloor<k<\lfloor{(n+1)a}\rfloor\)\(\lfloor{mb}\rfloor<k<\lfloor{(m+1)b}\rfloor\)

    • so : \({na}<k \leqslant \lfloor{(n+1)a}\rfloor-1 <{(n+1)a}-1\)

    • 移项: \(\frac{n}{k}<\frac{1}{a}<\frac{n+1}{k+1}\)\(b, m\)同理)

    • 所以: \(\frac{n+m}{k}<1<\frac{n+m+2}{k+1}\)

    • 最后: \(n+m<k<n+m+1\)

    • 显然,\(n,m,k\) 都是正整数的情况下,不可能成立

证毕

好了,让我们步入正题:

我们称先手必败的局势为“奇异局势”,如 \((0,0)\)

那么,我们可以很快求出下一个奇异局势,\((1,2)\)

通过穷举法可以证明

那么我们发现,以下的都是奇异局势:

\((1,2)\)

\((3,5)\)

\((4,7)\)

\((6,10)\)

\((8,13)\)

\(...\)

那么,我们就可以看出一些东西:

\((0,0)\) 是第 \(0\) 个奇异局势,那么第 \(k\) 个奇异局势(\(a_k, b_k\))必然有 \(a_k+k=b_k\) ,且 \(a_k=mex\{a_1,a_2,a_3,...,a_{k-1},b_1,b_2,b_3,...,b_{k-1}\}\)mex 指一个集合中没有出现过的最小自然数)

证明?(穷举+规律)

如果一个局势 \((a,b)\)\(a<b\)

  • 如果在它前面有 \(k\) 个奇异局势(不含 \((0,0)\)),现在 \(b-a\leqslant k\),那先手只需要将两堆石子同取 \((b-a)\) 个,就可以转化成后手的奇异局势

  • 如果 \(a\) 在前面的奇异局势中出现过,那么先手就可以将 \(b\) 取若干石子,又转化为后手的奇异局势

所以,就这样

但,怎么快速判断?

其实奇异局势正是将正整数划分了

想想beatty定理,是不是感觉到什么?

令(\(a_k\),\(b_k\)) 中 \(a_k=\lfloor{kn}\rfloor\),那 \(b_k=\lfloor{k(n+1)}\rfloor\) ,( \(n\) 为正无理数)

就有 \(\frac{1}{n}+\frac{1}{n+1}=1\)

解方程就得出 \(n=\frac{1 \pm \sqrt{5}}{2}\),显然 \(n=\frac{1 + \sqrt{5}}{2}\)

所以就可以做了!

【模板】威佐夫博弈

代码


3. nim游戏

\(n\) 堆石子,每次只能从 \(1\) 堆中取若干个(不可不取),无法操作者败。

我们先定义一下局势:

  • 若当前无法操作,我们称为必败态

  • 若一个状态可以走到一个必败态,则当前为必胜态

  • 若一个状态无法走到一个必败态,则当前为必败态

然后,我们引入一个函数:SG函数

  • 无法操作时,\(SG(x)=0\)

  • \(SG(x)=mex\{SG(y)\}\)\(y\) 为可由 \(x\) 转移得到的状态

所以,我们可以得到一下定义

  • \(SG(x)=0\),则为必败态

  • \(SG(x) \not = 0\),则为必胜态

那如果像nim游戏这样怎么判断局势呢?

一种暴力方法就是做记忆化搜索,每种状态求出SG值,进行判断

其实还有一种通用方法,就是将每堆石子的SG值求异或值,再判断

为什么是对的?

这里给出一种玄学证法:

  • 定义 \(a_i\)\(i\)SG值,则当前局势为 \(a_1 \oplus a_2 \oplus a_3\oplus...\oplus a_n=k\)

  • 证明1:对于一个必胜态(即 \(k \not = 0\)),一定可以存在一个转移使 \(a_1' \oplus a_2' \oplus a_3'\oplus...\oplus a_n'=0\)

    • 令k的最高位为 \(m\),则 \(a_1\) ~ \(a_n\) 一定存在一个 \(a_i\)\(m\) 位上也为 \(1\)

    • 那么就会有 \(a_i>a_i \oplus k\)

    • 所以只要使得 \(a_i'=a_i\oplus k\),就能转化成必败态

  • 证明2:对于一个必败态(即 \(k=0\)),不存在一个转移使得 \(a_1' \oplus a_2' \oplus a_3'\oplus...\oplus a_n'=0\)

    • 因为若 \(0\oplus k=0\),则 \(k=0\)

    • 所以 \(a_1 \oplus a_2 \oplus a_3\oplus...\oplus a_n \oplus 0=0\)

    • 又因为任何数异或上 \(0\) 等于原本的数

    • 所以与定义矛盾

  • 证毕(其实我不是真的很理解,因为我觉得有点用定义证明定义的样子)

好了,nim游戏就变成预处理所有的SG值,每次求每堆石子的异或值就行了

然后有一个nim游戏有个特殊点,以为它可以取任意个石子,所以 \(SG(x)=mex\{SG(x-1), SG(x-2),SG(x-3),...SG(0)\}\)

所以就有 \(SG(x)=x\)

所以代码极其简短!

【模板】nim 游戏

代码


扩展:反nim游戏

其实就是将nim游戏获胜条件换一下:无法操作者胜

但这不是单纯的将SG函数的定义反过来就可以了......

我们需要依靠经验寻找新的条件:

  • 若所有石子都是 \(1\),则异或值为 \(0\) 时,为必胜态

  • 若存在石子大于 \(1\),则异或值不为 \(0\) 时,为必胜态

证明:

  • 条件1:当石子堆数为偶数时,异或值才为 \(0\),显然条件成立

  • 条件2:我们分两种情况讨论:

      1. 如果只有一堆石子大于 \(1\)
      • 如果石子为 \(1\) 的堆数为奇数,显然先手可以将大于 \(1\) 的那堆全取完,后手必败;同时,此时异或值必然大于 \(0\)

      • 如果石子为 \(1\) 的堆数为偶数,显然先手可以将大于 \(1\) 的那堆取剩 \(1\),后手必败;同时,此时异或值必然大于 \(0\)

      1. 如果不止一堆石子大于 \(1\)

        • 如果异或值为 \(0\),无非转化成只有一堆石子大于 1不止一堆石子大于 1,显然异或值一定不为 \(0\) (怎么感觉有点循环论证)

        • 如果异或值不为 \(0\),则证明同nim游戏——证明1

(说实话真的有点迷迷糊糊,总感觉那里不对,有点“我证明我自己”的样子)

[SHOI2008]小约翰的游戏//UVA1566 John

(SH直接抄题是吧?)

代码


例题:P2599 [ZJOI2009]取石子游戏

题意:就是将nim游戏改成只可以取左右其中一堆

(这是一道神仙题,想了1个小时最后被迫去看题解了...)

思路:

我们先设 \(L[l][r]\) 为在 \([l,r]\) 区间的左侧(即 \(l-1\) 的位置)放上 \(L[l][r]\) 个石子,先手必败(\(R[l][r]\) 类似)

我们可以证明,\(L[l][r]\) 存在且唯一

唯一:若存在两个 \(L[l][r]\) ,那么较大的那个可以通过取若干个转化成较小的那个,这就变成必败态转移到必败态,不符合定义

存在:假设不存在这个 \(L[l][r]\),那先手如果取左边,无论取多少个,都会转化为后手的必胜态,显然就不能取左边,那就只能动右边的,那会得到一个必败态,那后手在左边拿若干个得到的也是一个必败态(相当于先在左边拿若干个,此时还是必胜态,再在右边拿,就是必败态),显然不成立

然后开始转移:

我们令 \(L=L[l][r-1]\)\(R=R[l][r-1]\)

开始分多种情况讨论:

  • Case 1:若 \(a[r]=R\) ,则 \(L[l][r]=0\)

    • 也就是说当前的 \([l,r]\) 就是一个必败态,所以 \(L[l][r]=0\)
  • Case 2:若 \(a[r]<L,\ a[r]<R\),则 \(L[l][r]=a[r]\)

    • 依据定义,我们可以知道 \((0\sim L-1,[l,r-1])\)\(([l,r-1],0\sim R-1)\) 都是必胜态,所以如果 \(L[l][r]=a[r]\),那后手就可以每次与先手拿一样个数的石子(在不同端),这样先手一定会先去玩一端的石子,这样就是后手的必胜态
  • Case 3: 若 \(R<a[r]\le L\),则 \(L[l][r]=a[r]-1\)

    • 我们假设先手在左边取石子,还剩下 \(y\) 个石子:如果 \(y<R\),后手就将右边的石子也取剩 \(y\) 个,就转化成Case 2

    • 如果 \(y\ge R\),那就将右边取剩 \(R+1\) 个,又回到Case 3

    • 假设先手在右边取石子,还剩下 \(y\) 个石子,若 \(y=R\),后手就直接将左边的石子取完

    • \(y<R\),则将左边取剩 \(y\) 个,转化为Case 2

    • \(y>R\),就将左边取剩 \(y-1\) 个,再回到Case 3

  • Case 4: 若 \(L\le a[r]< R\),则 \(L[l][r]=a[r]+1\)

    • 同理,我们假设先手在左边取石子,还剩下 \(y\) 个石子:如果 \(y<L\),那后手就将右边取剩 \(y\) 个,转化为Case 2

    • \(y=L\),则后手将右边的石子取完,转化为Case 1

    • \(y>L\),则后手将右边取剩 \(y-1\),回到Case 4

    • 假设先手先取右边的石子,还剩下 \(y\) 个石子,若 \(y<L\),则将左边取剩 \(y\) 个,转化为Case 2

    • \(y\ge L\),则将左边取剩 \(y+1\) 个,回到Case 4

  • Case 5:若 \(a[r]>L,\ a[r]>R\),则 \(L[l][r]=a[r]\)

    • 先手将左右某一堆取剩 \(y\) 个,若 \(y>L,R\),那就将另一堆一样取剩 \(y\),回到Case 5

    • \(y<L,R\),也将另一堆一样取剩 \(y\),回到Case 2

    • \(L\le y<R\)\(R<y\le L\),就将另一堆取剩 \(y+1\)\(y-1\),可以转化为Case 3Case 4

    • 反正大力讨论就好了

(注:上面5种情况的“左边”指位置 \(l-1\),“右边”指位置 \(r\)

然后 \(R[l][r]\) 刚好差不多反过来就行了

代码


4. 斐波那契博弈(fibonacci nim):

题意:有 \(n\) 枚石子,先手可以任取,但下一个人取的石子不可以超过前一个人取的石子的 \(2\) 倍。问先手在保证必胜的情况下,开始最少取多少个石子?

先抛出一个定理:齐肯多夫(Zeckendorf)定理:任何一个正整数可以表示为若干个不连续的斐波那契数的和

证明:

  • 若正整数 \(n\) 为斐波那契数,显然

  • 若正整数 \(n\) 不是斐波那契数,则设 \(f_i<n<f_{i+1}\)\(f_i\) 表示第 \(i\) 个斐波那契数)

  • 因为 \(f_{i+1}=f_{i}+f_{i-1}\) ,所以 \(n-f_i<f_{i-1}\)

  • \(n-f_i\) 再按照如上方法进行分解即可

证毕

于是,我们就可以抛出答案了:答案为将 \(n\) 按斐波那契数分解后,最小的一个斐波那契数

证明:

  • 根据定义,可得 \(n=\sum_{i=1}^{k} f[i]\),若先手开始时不全部取完

  • \(k=1\) ,那么先手必败。

  • \(f_i=f_{i-1}+f_{i-2}\) ,如果先手取大于等于 \(f_{i-2}\) 个则显然后手可以将剩下的一次性取完

  • 如果先手不全部取完,那么问题就转换为:后手的 \(k\not =1\) 的同规模的问题,下面我们会证明这个是必胜态

  • \(k\not =1\)

  • 如果先手取了 \(f[1]\),那么因为 \(f[2]\) 肯定不是 \(f[1]\) 的下一个斐波那契数,所以有 \(f[2]>2f[1]\)

  • 那就转化成取 \(f[2]\) 且不能一次性取完,只要因为是后手先取,所以无论如何都是先手最后取完 \(f[2]\)

  • 以此类推,先手会取完最后一个斐波那契数

证毕

(是不是又循环论证了啊...)

P6487 [COCI2010-2011#4] HRPA

代码


参考 (照抄) 资料:

One_Zzz——博弈论学习笔记
(整体框架)

百度百科——贝蒂定理
(beatty定理的证明)

蒟蒻wyx——题解 P2252 【取石子游戏】
(beatty定理在威佐夫博弈的运用)

知乎:阿尔法栗子——组合博弈与SG函数知识梳理
(SG函数异或值判断局势的证明)

Push_Y's Blog:博弈游戏之——Fibonacci Nim
(斐波那契nim的证明)

posted @ 2022-03-10 13:19  zuytong  阅读(179)  评论(0编辑  收藏  举报