Loading

game theory

公平博弈专题

前言

众所周知的,博弈论是oi中一个重要且不易得分的版块

但是oiWiki上的解释有十分的不很全面

(浅浅d一下吧

所以这里来稍微介绍一下

因为其他非公平类博弈过于逆天了,这里只简单介绍一下公平组合游戏(逃

四大博弈模型

四大博弈模型是oi中常用的基本博弈模型,

有很多种博弈题由他们变化而来

巴什博弈(Bash game)

题意简述

Alice和Bob轮流取一堆总数为n的石子。每次至少拿1颗,至多拿m颗,不能不拿,取到最后一颗者获胜。

(下面所有例题都将使用Alice和Bob作为主人公,算是传统吧,至于为什么,可能是他们足够聪明吧

(这里默认SG函数这种小东西已经学会啊,如果没有快快去复习!oi-wiki

其实我们也可以先不考虑SG函数的

这时候就要拖出这样一张图了

我们假设m很小,只有3

考虑当剩余几颗石子时,先手必胜或必败

image

不难发现,当剩余石子数小于等于m时,

先手可以直接取完,直接获胜

所以1~3都是先手必胜态

4只能到达一个先手必胜态,

所以在4时,无论怎么走,

自己的下家一定有必胜策略,所以4是一个先手必败态

而6~8可以通过取一定量的石子是直接的下家得到4的状态,

也就是一个必输状态,

此时对方必输,所以6~89都是必胜态

同类由9能到达的位置全部为必胜态,

所以9为必败态

以此类推。。。。


SG函数

到这里,我们不妨再说一下SG函数,

我们设一个状态x为必败态,

那么SG(x) = 0

为什么这么说呢,来看一下SG函数的求法:

这是oi-Wiki上的说法:

\[设状态x能到达的状态分别为有,y_1,y_2,y_3... \]

\[那么SG(x)=mex\{SG(y),SG(y_1),SG(y_2)...SG(y_k)\} \]

其中mex为\(mex(S)=min\{x\}(x\notin S,x\in N)\)

根据上面的例子,我们设SG(0) = 0

则SG(1)=1,SG(2)=2,SG(3)=3,SG(4)=0

我们发现这样推下去,任意一个必败态,他的SG值一定是0

发明SG函数的一定是个天才


N/P态

同时,在上面的图中,我们使用了“必胜态”“必败态”这两个名词

现在我们换成两个逼格更高的另外两个名词:

P态(Previous):对于前一个玩家是必胜的
N态(Next):对于后一个玩家是必胜的

不难发现,对于一个P态,他能到达的状态至少一个是N态

而N态最后能到的所有态一定都是P态


那么巴什博弈差不多就这些,他比较简单

尼姆博弈(Nim game)

题意简述

Alice和Bob轮流从n堆石子中拿取一定数量的石子,每次取时先选择某一堆,再从中拿取任意数量个石子,至少拿1个,至多将这一全部拿走,不能不拿。拿到最后一个石子的获胜。给定每堆石子数量

博弈树

这里为了更好的研究这类问题,我们引入一个东西:博弈图

我们将游戏的每个状态看作一个节点,

每个状态向它能到达的所有子状态都连一条有向边

就建成了一个博弈状态图

也有叫博弈树的

游戏值:如果给获胜、落败、打平都给一个分数的话,那么每个状态都对应了一个游戏值,该值为游戏双方从该局面出发以最优策略博弈后,己方所能获得的分数。

Max状态:假设当前状态轮到己方走,有多个可以选择的后继状态,那么一定选择游戏值最大的后继状态。对 应的游戏值也是当前状态的游戏值。这样的状态称为Max状态。

Min状态:假设当前状态轮到对方走,有多个可以选择的后继状态,那么一定选择游戏值最小的后继状态。对 应的游戏值也是当前撞他的游戏值。这样的状态称为Min状态。

以上这几条可能有点绕(其实也没太大用)仔细看看就好吧。。。

那么在这一个图上,我们会发现一些max态的min态不能更新为max态

我们像搜索剪枝一样,剪掉就好了啊!

这就是alpha-beta剪枝

大部分博弈游戏都可以转化成图的形式,比如刚刚提到的bash游戏

下面来接着看看这个Nim游戏

我们可以将有x石子的堆视为节点x,显然的,当且仅当y<x时,节点x可以到达y。

由n个堆组成的Nim游戏,就可以视为n个有向图游戏了。


这里我们在提出一下SG定理吧

SG定理

这东西真挺玄学的

SG定理其实wiki上是有讲的,讲的也很好懂,

我这里只简单描述一下,

对于一个由多个有向图博弈游戏(要有向的!)组合成的组合游戏,这一整个游戏的SG值为\(SG(s_1)\oplus SG(s_2)\oplus SG(S_3)\oplus .... \oplus SG(s_k)\)

对于一个SG值为k的状态,必然能转移到j(0<j<k)的状态,也就相当于一个有k个石子的堆拿走了k-j个,

这样将SG值转化为了石子数来考虑,所以我们可以将SG值异或起来,本质上就是Nim游戏。

这个定理很重要!

再次解释

使用异或求解SG和固然简单,但是这个问题我们显然可以从一个更加数学化的角度解决

我们假设当前只有一堆,即\(n=1\)那么我们直接取掉就可以啦

当前\(n=2\)\(a_1\neq a_2\)时,我们假设较大值为\(a_1\),先手取走\(a_1-a_2\),那么无论后手此时选择取什么,先手都能去一样的,先手胜

\(n=2\)\(a_1=a_2\)先手取什么后手都可以取相同的,后手胜

那么。。。当\(n>=3\)时呢?

我们考虑异或和的情况

假设当前情况下,\(a_1 \wedge a_2 \wedge ....\wedge a_i \wedge .... \wedge a_n = 0\)

下面先手在第\(a_i\)堆中取出了k个,

那么\(a_1 \wedge a_2 \wedge ....\wedge a_i‘ \wedge .... \wedge a_n = k\)

也就是\(a_1 \wedge a_2 \wedge ....\wedge a_i \wedge .... \wedge a_n \wedge k = 0\)

根据异或的性质,我们一定可以确定,存在一个\(a_j\),使得\(a_j\wedge a_i = k\)

那么后手将\(a_j\)取出\(a_j-(a_j\wedge k)\)个即可,又回到了异或和为0的情况

知道先手不能再取,所以后手胜,同理异或和不为零时先手胜


根据 SG 定理,就可以得出Nim和了。

所以我们将每堆石子个数异或起来,只要不为0,先手就一定获胜咯

例题:

P2197 【模板】Nim 游戏
P2599 [ZJOI2009] 取石子游戏
acwing 剪纸游戏
P8606 [蓝桥杯 2013 国 B] 高僧斗法

#include<bits/stdc++.h>
using namespace std;

int t,n;

int main(){
	cin >> t;
	while(t--){
		cin >> n;
		int ans=0;
		int in;
		for(int i=1; i<=n; ++i){
			cin >> in;
			ans^=in;
		}
		if(!ans) cout << "No\n";
		else cout<< "Yes\n";
	}
}
EX:Nim-K游戏

题意简述

Alice和Bob轮流从n堆石子中拿取一定数量的石子,每次操作者\(k\)中拿取任意数量个石子,至多将这一全部拿走,可以不拿。拿到最后一个石子的获胜。给定每堆石子数量

结论

这个游戏实际是\(nim\)游戏的扩展版,也有一个很好的结论:将每堆石子数用二进制表示,对于二进制的任意一位,如果这一位为\(1\)的石子堆数\(\%(k+1)\)全部为\(0\),那么先手必败,否则先手必胜。

证明

首先有以下两点

  1. 任意先手必胜的局面都能传变成先手必败的局面。

  2. 任意先手必败的局面都不能转变为先手必胜的局面。

\(1\)条证明:

假设最高一位\(1\)的数量为\(m\),且\(m\%(k+1) = m',m'\neq 0\)

记这\(m'\)堆编号分别为\(b_1,b_2....b_{m'}\),并将这些堆的第一位变成\(0\)

下面考虑第二高位为\(1\)的数量为\(n\),且\(n\%(k+1) = n',n'\neq 0\),并记这一位为\(x\)

\(b_1.....b_{m'}\)这些堆中第\(x\)位有\(a\)个为\(1\)\(b\)个为\(0\),下面将这些堆的\(x\)位变成\(0\)

如果\(n'\le a\),显然将这\(a\)堆中\(n'\)个变成\(0\)即可

如果\((k+1)-n’ \le b\),那么只要将\(b\)个中的\((k+1)-n'\)个变成\(1\)即可,因为之前最高位是将\(1\)\(0\),所以这一位即使由\(0\)\(1\),这堆石子数也是减少的;

如果这两个都不满足,那么\(a<n'\&\&b<(k+1)-n'\),这时只要将这\(a\)堆和这\(m'\)堆之外的\(n'-a\)堆的这一位\(1\)变成\(0\),那么总改变堆数为\(a+b+(n'-a)=b+n'<(k+1)-n'+n'=k+1\),也就是说将这一位变为\(\%(k+1)=0\)需要改变的总堆数要小于\((k+1)\)

也就是说,可以一次操作完成,然后以此类推就能使每一位都变为\(\%(k+1)=0\)

\(2\)条证明:

因为一次最多操作\(k\)堆石子,因此不能将\((k+1)\)堆某一位是\(1\)的石子堆的这一位总数模\((k+1)\)都变为\(0\)

结果得证

EX:anti-Nim游戏

题意简述

Alice和Bob轮流从n堆石子中拿取一定数量的石子,每次取时先选择某一堆,再从中拿取任意数量个石子,至少拿1个,至多将这一全部拿走,不能不拿。拿到最后一个石子的。给定每堆石子数量

反nim游戏。正常的nim游戏是取走最后一颗的人获胜,而反nim游戏是取走最后一颗的人输

结论

以下两个条件满足其一即可(貌似并不能同时满足):

  1. 所有堆的石子个数\(=1\),且异或和\(=0\)(其实这里就是有偶数堆的意思)。
  2. 至少存在一堆石子个数\(>1\),且异或和\(\neq 0\)

证明

当每堆都是\(1\)

异或和为0代表\(n\)为偶数(情况1.1),那么从第一个开始取,每次每人只能取一个,偶数个的话,最后一个显然是后手取到

n为奇数(情况1.2),显然是先手取到最后一个

当只有一堆石子数大于\(1\)

此时显然异或和不为\(0\)

\(n\)为奇数(情况2.1),我们将石子数大于\(1\)的一堆,取成\(0\)

此时,便转化为全是1的情况,即情况(1.2)

\(n\)为偶数(情况2.2)时同理,所以此种状态先手必胜

状态2是必胜态

当不止一堆石子数大于\(1\)

若异或和为不为\(0\)(情况3.1)

所以此时一定可以像普通Nim游戏一样,转移至情况(3.2)

若异或和为\(0\)(情况3.2),那么可以转化为以下两种状态之一:

  1. 剩余中只有一堆数量大于\(1\),转化为必胜状态\(2.1\)\(2.2\)
  2. 剩余中至少两堆数量大于\(1\),转化为情况(3.1)

所以(3.1)为必胜态,(3.2)为必败态

结果得证

例题:P4279 [SHOI2008] 小约翰的游戏

EX:mulit-Nim游戏(grundy game)

题意简述

Alice和Bob轮流在\(n\)堆石子中操作,两人可以从任意一堆石子中拿任意多个石子(不能不拿)或把一堆数量不少于2的石子分为两堆不为空的石子。规定没法拿的人失败。

前几个状态的\(SG\)值:

\(sg(1)=mex\{sg(0)\}\)

\(sg(2)=mex\{sg(0),sg(1)\}=2\)

\(sg(3)=mex\{sg(0),sg(1),sg(2),sg(1,2)\}=4\)

\(sg(4)=mex\{sg(0),sg(1),sg(2),sg(1,3),sg(2,2),sg(3)\}=3\)

如果继续推下去可以发现一个结论:

\[SG(x) = \begin{cases} x-1(x\ mod\ 4 = 0) \\ x(x \ mod \ 4 = 1\vee 2) \\ x+1(x \ mod \ 4 = 3) \end{cases} \]

其实直接推SG函数即可

例题:P3235 [HNOI2014] 江南乐

HDU 3032

POJ 2311

BZOJ 2940

BZOJ 1188

EX:阶梯 Nim游戏

题意简述

\(n\) 堆石子,每堆石子的数量为 \(x_1,x_2,…,x_n\),Alice,Bob 轮流操作,每次可以选第 \(k\) 堆中的任意多个石子放到第 \(k−1\) 堆中,第 \(1\) 堆中的石子可以放到第 \(0\) 堆中,最后无法操作的人为输。问 Alice 先手是否有必胜策略。

结论

当奇数堆中的石子数异或和为 0 时,先手必败,负责先手必胜

证明

先手选择将奇数堆的异或和变为 0 。如果不能则已经必败。

此时如果后手移动奇数堆,那么将奇数堆的 nim 和重新变为 0 。

如果移动的是偶数堆,那么后手移动到奇数堆的石子继续往下移。

经过多次操作总能保证奇数堆处于必胜状态,最后先手总可以在后手之后将石子从奇数堆移动到偶数堆,最后移动到 0 堆。此时对手就不能移动了。

例题:P3480 [POI2009] KAM-Pebbles

P2575 高手过招

EX:every-Nim 游戏

题意简述

Alice和Bob同时进行n个Nim游戏,轮到他时必须玩所有还没结束的游戏。最后结束的游戏的输赢就是整个游戏的输赢。

这种题增加了一个性质:步数。
容易想到,每局游戏如果能赢,一定要赢,而且往后拖得越久越好;如果必输,一定输得越快越好。令ans为最后结束的那个游戏的步数,则ans为奇数时先手赢,偶数时后手赢。

\[step(当前状态)=\begin{cases}0\ \ \ \ 已经输了\\ max{step(所有必输的上一状态)}+1 \ sg(当前状态)!=0 \\min{step(上一状态)}+1 \ \ sg(当前状态)=0\end{cases} \]

例题: HDU - 3595

斐波那契博弈(Fibonacci game)

题意简述

有一堆石子,Alice和Bob轮流取,先手第一次可以取任意个但不能全部取完。之后每次取的数量必须大于等于1且小于等于上次取的数量的两倍,最后把物品全部取完者胜利。

我个人认为斐波那契博弈是一种比SG定理还玄学的东西

直接讲定理吧:

斐波那契博弈先手必败当且仅当石子数是斐波那契数

证明吗。。。先看这个

齐肯多夫定理

任意正整数可以被拆分为若干个不连续的 Fibonacci 数之和。

以F(n)来表示第n个斐波那契数。m为任意正整数。

当m=1,2,3时,因为1=F(2),2=F(3),3=F(4),所以命题成立。下面采用数学归纳法证明定理对任何m均成立。

假设定理对任何小于m的正整数数都成立。下证命题对m也成立。

(1)若m是斐波那契数,则命题对m也成立。

(2)若m不是斐波那契数,设n1是满足F(n1)< m < F(n1 +1)的最大正整数。
设m'=m-F(n1),则m'=m-F(n1)<F(n1+1)-F(n1)=F(n1-1),即m'<F(n1-1)。
m'<m,所以由归纳假设,m'可以表示成不连续的斐波那契数之和,即m'=F(n2)+F(n3)+...+F(nt),其中n2>n3>...>nt,且是不连续的整数。又m'<F(n1-1),所以n2<n1-1,即n2与n1也是不连续的整数。

故m=F(n1)+m'=F(n1)+F(n2)+F(n3)+...+F(nt),且n1>n2>...>nt是不连续的整数。

因此,命题对m也成立。

综合(1)(2),由数学归纳法,齐肯多夫定理对任何正整数m都成立。
(来自百度百科)


那我们现在可以开始证明斐波那契博弈了

首先证明是斐波那契数时先手必胜

必败证明

首先,n小于等于2时,先手必输,易证

当n为其他斐波那契数时,

设n为f(k),则先手不能拿超过f(k-2)个

否则\(n'=f(k)-f(k-2)=f(k-1)=f(k-2)+f(k-3)<f(k-2)*2\)

后手直接胜利,所以取走的数量一定小于f(k-2)

我们将f(k-2)看作一个子游戏,设后手可以取完,

则剩余f(k-1)个,则先手依旧输


必胜证明

下面证明不是斐波那契数时,

先手必胜

根据齐肯多夫定理

我们设\(n=f(a_1)+f(a_2)+...+f(a_k)\)

其中数列单调递减,且不为连续数

因为\(f(a_k)<=f(a_{k-1})-2\)

所以有

\[2f(a_k)<=2f(a_{k-1}-2)<=f(a_{k-1}) \]

第k项取1,k-1项取3时取到等号

因为若每项之间差值为2的话,n为斐波那契数,与假设相不符

所以必然存在k,使得\(a_k-a_{k+1}>=3\)

满足不连续整数的限制

n可以表示为

\[n = f(a_1)+f(a_2)+...+f(a_k)+f(a_k+1) \]

所以后手只能取出f(q_{k-1})的一部分

后手就相当于一个\(n=f(a_{k-1})\)的子游戏

那么他必败

证毕


例题:

HDU 2561
P6487 [COCI2010-2011#4] HRPA
P6791 [SNOI2020] 取石子

#include<bits/stdc++.h>
using namespace std;

long long n,x,y,z;
int main(){
	cin>>n;
	while(1){
		if(n==1){
            cout << 1;
            return 0;
        }
		if(n==2){
            cout << 2;
            return 0;
        }

		x=1,y=2,z=3;

		while(z<n)
            x=y,y=z,z=x+y;

		if(z==n){
            cout << z;
            return 0;
        }
        else n-=y;
	}
	return 0;
}



威佐夫博弈 (Wythoff's game)

题意简述

有两堆石子,各若干个,Alice和Bob两个人轮流从任一堆取至少一个或同时从两堆中取同样多的石子,规定每次至少取一个,多者不限,最后取光者得胜。

我们在这里先把这种博弈的性质搬上来:

对于一个必败状态,第一个数字是这个状态的两堆石子数量的差∗1.618

证明

结论也是非常的amazing啊,对于结论的出现,我们使用两种方法推出

  1. 大家都会的,打表

我们首先考虑一些数据比较好看的奇异局面(必败局面)

那么什么情况下一个局面必败呢?

首先不难发现,当两堆石子数量一样时,除了(0,0),一定时先手必胜

其它情况呢?我们以(1,2)为例

先手共以下几种选择

a. 在第一堆选一个,此时剩下(0,2),是一个必胜态

b. 在第二堆选一个,此时剩下(1,1),必胜态

c. 在第二堆选两个,此时剩下(1,0),又是必胜态

c. 在两堆中都选一个,此时剩下(0,1),还是必胜态

那么根据我们之前提到的N/P态,

我们知道状态(1,2)是一个必败态,因为它能到达的所有状态都是必胜态

依据这种推论,我们打出一张表:

必败态
(0,0)
(1,2)
(3,5)
(4,7)
(6,10)
(8,13)
(9,15)
(11,18)
(12,20)

很难不发现,这些数据是符合上面我们提到的结论的

  1. 打表猜题天地灭,数学推导保平安

首先,我们易得,

对于两个状态(a,b)和(b,a),他们的胜负态是一致的

我们记作定理一

同时,我们易得,

假定必败态(a,b),那么

对任意\(x\ne a\)\(y\ne b\)

(x,b),(a,y)都是必胜态

因为如果x或y比较大,那么他们可以到达(a,b)这个必败态,则它们本身是一个必胜态

又或者x或y比较小,由(a,b)达到,那么(a,b)这个必败态所能到达的每一个状态都是必胜态,

所以(x,b),(a,y)一定都是必胜态

我们记作定理二

由此我们也可以推出,对于所有必败态,

除0外,每个数字都只出现过一次

我们依照这个规律去尝试构建一个矩阵

\[1,2\\ 3,5\\ 4,7\\ 6,10\\ ...... \]

也是不难发现一些规律:每一行第一个数字是之前没出现过的最小数字

我们记作定理三

那么我们浅浅地证明一下

我们假定一个必败态为(k,k+i)

那么根据假设,一定存在\(j(0<j<k)\)使\((k-j,k-j+i),(k,k-j+i),(k-j,k+i)\)必败,那么显然,(k,k+i-j)必胜,所以(k-j,k-j+i)(k-j,k+i)必败4

根据鸽巢原理,必然存在至少三个i,取值记作\(i_1,i_2,i_3\),使得\(j_1=j_2=j_3=m\)。对这3个\(i\),同样必然存在一对\(i\),不妨为\((i_1,i_2)\),使\((k-m,k+i_1-m)\)\((k-m,k+i_2-m)\)必败或\(f(k-m,k+i_1)\)\(f(k-m,k+i_2)\)必败。显然与定理2矛盾,因此不存在这样的数k。

如果你还不知道什么是鸽巢原理的话。。。。,我是鸽巢原理qwq

所以根据以上定义,可得,每一行为升序且第二列数比同行第一列要大,所以每一行第一个数必然是之前没出现过的最小数啦

我们再次观察矩阵,我们发现,第i行的第二个数等于第一个数加i

我们记作定理四

使用数学归纳法

我们首先设一组状态为(a,a+k)且满足定理四,现对其进行讨论,那么如果对于一组(a,a+j),j>k显然可以移动到a+k的状态,必胜

下面讨论j=k1的情况

我们考虑从两个数中取出p个,

因为有(a-p,a-p+d)的情况,(设此情况必败)

根据定理三,每个数只会出现一次,又因为具有必败性,显然不成立

(a,a-p+j)一定为必胜态

在两堆中同时选的情况类似,所以定理四得证

为了下面的证明,我们要引用一个小知识点

贝亚蒂定理(Beatty's theorem)

若两个正无理数的倒数和是1,则任何正整数都可刚好以一种形式表示为不大于其中一个无理数的正整数倍的最大整数。(来自百度)


下面我们继续证明

这样,第二个数可以被表示为\(\rfloor (a+1)n \rfloor\)(已证)

根据贝蒂亚定理,\(\frac{1}{𝑎}+\frac{1}{𝑎+1}=1\)

解:

\[\frac{1}{𝑎}+\frac{1}{𝑎+1}=1\\ 𝑎^2−𝑎−1=0\\ \Delta=5\\ 𝑎_1=\frac{1+\sqrt{\Delta}}{2},𝑎_2=\frac{1−\sqrt{\Delta}}{2}\\ 因为,a > 1\\ 我们取𝑎=\frac{1+\sqrt{5}}{2} 所以第𝑘*k*奇异局势的第一个数是\lfloor 𝑎𝑘 \rfloor \]

所以,如果这是一个奇异局势,那么第一个数是两数差值乘黄金比下取整。

那么到这里,我们就差不多整完了

小总结:

定理一:对于两个状态(a,b)和(b,a),他们的胜负态是一致的

定理二:假定必败态(a,b),那么对任意\(x\ne a\)\(y\ne b\),(x,b),(a,y)都是必胜态

定理三:对于所有必败态,除0外,每个数字都只出现过一次,且每一行第一个数字是之前没出现过的最小数字

定理四:第i行的第二个数等于第一个数加i

tip:由于语言精度问题,实际书写代码时请使用\(\frac{1+\sqrt{5}}{2}\),而不是1.618...

例题:

P2252 [SHOI2002] 取石子游戏

#include<bits/stdc++.h>
using namespace std;
int n, m;
const double gold = (sqrt(5.0) + 1.0) / 2.0;

int main(){
    cin >> n >> m;
    if(n < m)
        swap(n, m);
    int a = n-m;
    if(m == int(gold * (double)a))
        cout << 0 << endl;
    else cout << 1 << endl;
}

其它博弈模型

翻硬币游戏

题意简述

N 枚硬币排成一排,有的正面朝上,有的反面朝上。我们从左开始对硬币按1 到N 编号。

Alice和Bob轮流翻硬币,每次所翻动的硬币中,最右边那个硬币的必须是从正面翻到反面。不能翻者谁输

题意有点模糊,这里解释一下

若当前要翻动\(3\)枚硬币,场上一共有三枚硬币,呈现正正反排布,那么此时不能翻动,因为最右边的硬币不是正面朝上

结论

局面的SG 值为局面中每个正面朝上的棋子单一存在时的SG 值的异或和。

结论也有点模糊,这里也解释一下

假设现在局面为【反反正正反正】,其中第二,三,六枚硬币是正的

那么当前局面的\(SG\)值为【反反正】,【反反反正】,【反反反反反正】三种情况\(SG\)值的异或和

现在这个情况太范范了,我们考虑一些限制下的具体情况做讨论

限制一

每次只能翻动一个硬币

显然的,当正面的硬币反转后,就少了一个可以操作的硬币,所以当正面硬币个数为奇数时,先手胜,否则后手胜

这个限制显然符合结论

限制二

每次能翻转一个或两个硬币。(不用连续)

考虑这种博弈其实和Nim博弈十分类似

设现有局面的\(SG\)值异或和为\(x\),即\(a_1 \wedge a_2 \wedge ...\wedge a_n = x\)

那么玩家必然可以通过翻转一个或两个硬币使得异或和为0

证明

我们设x的二进制表示中最高一位1在第k位,那么在\(a_1,a_2,...,a_n\)中,必然有一个数\(a_i\),它的第\(k\)位是\(1\),同时,我们设\(a_i' = a_i \wedge x<a_i\)

如果 \(ai' = 0\),我们将 \(ai\) 这个值从式子中去掉就可以了,也就是把编号为\(a_i'\)的正面硬币翻成背面就可以了。

如果\(ai' \neq 0\),那么我们把 \(a_i\) 这个值从式子中去掉之后,还要再在式子中加上\(a_i'\),操作就是把编号为\(a_i\)的正面硬币翻成背面,加上\(a_i'\) ,就是再翻转编号为\(a_i'\) 的硬币。

反转操作也就可以理解为异或

限制三

每次必须连续翻转k个硬币

这种博弈反而像更简单的巴什博弈一点

下面举一个例子,设现在存在\(6\)枚硬币,\(k=3\)

\(1\)表示正面,\(0\)表示反面

假设这\(6\)枚硬币表现为这种形式:\(000001\)

那么先手只能选择最后三枚,将状态转化为\(000110\),再将此时状态分解一下

得到了\(0001\),\(00001\)两个状态,也就是,初始状态的\(SG\)值由这两个状态的\(SG\)值转移过来

其实就类似于从\(6\),取到了\(5\)\(4\)

也就是标准的巴什博弈

\(SG\)值为\(001001001....\)也就是每\(k-1\)\(0\)一个\(1\)的值

局面中出现更多枚硬币时,相当于几组游戏同时

符合异或和的结论

限制四

每次只能翻1~3个硬币(Mock Turtles Game)

可以使用SG函数解决

\[g(x) = max\{g(0),g(1),....,g(x-1),g(0)\oplus g(1),....g(0) \oplus g(1) \oplus g(2) ...\} \]

这样我们不难发现,表长这个样子

x g(X)
0 1
1 2
2 4
3 7
4 8
5 11
6 13

所以,\(g(x) = 2x+[count(x)\equiv 0(mod \ 2)]\)

下面引入一个概念:我们称一个非负整数为odious,当且仅当该数的二进制形式的1出现的次数是奇数,否则称作evil。

所以1,2,4,7是odious,因为它们的二进制形式是1,10,100,111。而0,3,5,6是evil,由于它们的二进制形式是0,11,101,110。

而上面那个表中。貌似sg值都是odious数。所以当2x为odious时,sg值是2x,当2x是evil时。sg值是2x+1.

这样怎么证明呢?我们会发现发现:

evil ^ evil = odious ^ odious = evil

evil ^ odious = odious ^ evil = odious

如果刚才的假说是成立的,我们想证明下一个sg值为下一个odious数。注意到我们总能够在第x位置翻转硬币到达sg为0的情况;通过翻转第x位置的硬币和两个其他硬币。我们能够移动到全部较小的evil数,由于每一个非零的evil数都能够由两个odious数异或得到。可是我们不能移动到下一个odious数,由于不论什么两个odious数的异或都是evil数。

假设在一个Mock Turtles游戏中的首正硬币位置x1,x2,…,xn是个P局面。即sg[x1]…sg[xn]=0.那么无可置疑的是n必然是偶数,由于奇数个odious数的异或是odious数,不可能等于0。而由上面可知sg[x]是2x或者2x+1,sg[x]又是偶数个,那么x1 ^ x 2 ^ …^ xn = 0。相反,假设x1 ^ x 2 ^ … ^ xn = 0且n是偶数,那么sg[x1] ^ … ^ sg[xn]=0。这个假设不太理解的话,我们能够先这么看下:2x在二进制其中相当于把x所有左移一位,然后补零,比方说2的二进制是10。那么4的二进制就是100。而2x+1在二进制其中相当于把x所有左移一位,然后补1,比方说2的二进制是10,5的二进制是101。如今看下sg[x1] ^ … ^ sg[xn]=0,由于sg[x]是2x或者2x+1。所以式子中的2x+1必须是偶数个(由于2x的最后一位都是0,2x+1的最后一位都是1,要最后异或为0,2x+1必须出现偶数次),所以:MT游戏其中的P局面是拥有偶数堆石子的Nim游戏的P局面。

其实只需要记住MT游戏中每个位置的sg为对应的odious数(2x或2x+1)即可

限制五

每次必须翻动两个硬币,并且这两个硬币的距离要在可行集S={1,2,3}中(Twins Game)

\(n = 1\)时,硬币为:H,先手必输,所以sg[0]=0。

\(n = 2\)时,硬币为:TH,先手必赢。所以sg[1]=1。

\(n = 3\)时,硬币为:TTH。先手必赢,所以sg[2]=2。

\(n = 4\)时,硬币为:TTTH,先手必赢,所以sg[3]=3。

\(n = 5\)时,硬币为:TTTTH,先手必输,所以sg[4]=0。

x 0 1 2 3 4 5 6 7 8 9 10 11 12
sg(x) 0 1 2 3 0 1 2 3 0 1 2 3 0

限制六

每次翻动一个硬币后必须翻动其左侧三个硬币中的一个,即翻动第x个硬币后必须选择x-1,x-2,x-3中的当中一个硬币进行翻动,除非\(x \le 3\)(Subtraction Game)

还是可以转化为类似巴什博弈的模型

\(n = 1\)时,硬币为:H,先手必赢,所以sg[1]=1。

\(n = 2\)时。硬币为:TH,先手必赢,由于先手能够翻成反反或正反。可能性为2。所以sg[2] == 2。

\(n = 3\)时,硬币为:TTH,先手操作后能够为:TH

x 1 2 3 4 5 6 7 8 9 10 11 12 13
sg(x) 1 2 3 0 1 2 3 0 1 2 3 0 1

这个与每次最多仅仅能取3个石子的取石子游戏的SG分布一样,与约束条件5一样。

限制七

每次能够连续翻动随意个硬币,至少翻一个。(Ruler Game)

据说sg函数像尺子刻度(大雾

SG函数是\(sg(n)=mex\{0,sg(n-1),sg(n-1) \oplus sg(n-2),…,sg(n-1) \oplus … \oplus sg(1)\}\)

x 1 2 3 4 5 6 7 8 9 10 11 12 13
sg(x) 1 2 1 4 1 2 1 8 1 2 1 4 1

所以sg值为x的因数其中2的能达到的最大次幂。比方14=2 * 7,最大1次幂。即2;16=2 * 2 * 2 * 2。最大4次幂,即16。

限制八

每次必须翻转4个对称的硬币,最左与最右的硬币都必须是从正翻到反(保证初始的时候两端都为正面)(Grunt Game)

当正硬币位置为0,1,2时是terminal局面,即 终结局面,sg值都是0。当正硬币位置n大于等于3的时候的局面能够通过翻\(0,x,n-x,n\)四个位置得到(当中\(x<n/2\)可保证胜利)。

这就像是把一堆石子分成两堆不同大小石子的游戏,也就是Grundy游戏。


引用/参考:

https://baike.baidu.com/item/齐肯多夫定理/7612155
https://baike.baidu.com/item/威佐夫博弈/19858256
https://baike.baidu.com/item/贝亚蒂定理/12284007
https://zhuanlan.zhihu.com/p/572072831
https://blog.csdn.net/a_forever_dream/article/details/104813148
https://blog.csdn.net/weixin_45775438/article/details/108381804
https://blog.csdn.net/clover_hxy/article/details/53818624
https://www.cnblogs.com/xiaojuA/p/9841859.html
https://www.cnblogs.com/exponent/articles/2141477.html
https://www.cnblogs.com/tttkf/p/15895646.html
https://www.cnblogs.com/Khada-Jhin/p/9609561.html
https://www.cnblogs.com/BigSmall-En/p/nim.html
https://www.cnblogs.com/dyhaohaoxuexi/p/14418900.html
https://www.luogu.com.cn/problem/solution/P6791
https://www.luogu.com.cn/problem/solution/P2252
https://www.luogu.com.cn/article/kiar4its
https://oi-wiki.org/math/game-theory/impartial-game

posted @ 2024-12-17 14:18  white__ice  阅读(148)  评论(0)    收藏  举报