Wythoff博弈原理与证明

简介

Wythoff博弈的定义是:

有两堆若干个物品,两人轮流从某一堆物品中取至少一个或同时从两堆中取相同数量的物品,不能不取,最后把物品全部取完者胜利

现在给出两堆物品的数量 \(n,m\) 判断先手是否有策略必胜

推理

我们用 \((a,b)\) 表示第一堆数量为 \(a\) ,第二堆数量为 \(b\) 的局势,并规定 \(a\leq b\) ,因为所有局势经过互换后都能表示为这样的形式

定义一个 奇异局势 为先手必输的局势,可以发现 \((0,0),(1,2),(3,5)\)​ 等都是奇异局势,设 \(P_k\)​ 为包含了前 \(k\)​ 个奇异局势中的所有数字的集合,设 \(a_{k+1}=\operatorname{mex}(P_k),b_{k+1}=a_k+k\) ,观察规律,猜想第 \(k+1\)​ 个奇异局势为 \((a_{k+1},b_{k+1})\)​ ,下面我们来证明这一猜想:

先证明几个命题:

  1. 任何自然数都包含在一个且仅在一个奇异局势中

    用归纳法:

    • \(n=0\) 包含在第一个奇异局势中

    • 若满足 \(n\leq k\) 的所有自然数都包含在前 \(m\) 个奇异局势中,那么由 \(\operatorname{mex}\) 的定义可知,第 \(m+1\) 个局势中包含 \(k+1\)

    综上,任何自然数都包含在一个奇异局势中

    若自然数 \(b\) 包含在两个奇异局势中,那么显然只有一种情况 \((a,b),(b,c)\) 这与 \(\operatorname{mex}\) 的定义矛盾,若包含在 \(m\geq 2\) 个奇异局势中,那么任取两个奇异局势都不满足条件

    综上,任何自然数都仅包含在一个奇异局势中

  2. 任何操作都可以将奇异局势变为非奇异局势

    我们只要证明:任何操作都无法将奇异局势变为另一个奇异局势即可

    设存在操作能将第 \(i\) 中奇异局势 \((a_i,b_i)\) 变为第 \(j\) 种奇异局势 \((a_j,b_j)\) ,由于 \(b_i-a_i=i,b_j-a_j=j\) 所以无法通过两堆同时取相同数量物品的操作转变,而由命题1可得这两个局势中的四个数互不相等,所以改变一堆数量的操作最多使两数相等,另两数仍不等,所以这种操作不存在,得证

  3. 所有非奇异局势都可以通过适当方法转换为奇异局势

    设集合 \(A=\{a_i\mid i\in \mathbb{N}\},B=\{b_i\mid i\in\mathbb{N}\}\) ,由命题1可知: \(A\cup B=\mathbb{N}\)

    对于局势 \((a,b)\) ,若 \(a\not\in A\)\(b\not\in B\) ,则 \(a\in B\)\(b\in A\) ,互换 \(a,b\) 后即可得到 \(a\in A\) 或(且) \(b\in B\) 的情形,下面我们对(或)这一情形的所有情况进行分类讨论:

    • \(a=a_k,b>b_k\) :第二堆取 \(b-b_k\)
    • \(a=a_k,b<b_k\) :两堆同时取 \(a-a_{b-a}\)
    • \(a>a_k,b=b_k\) :第一堆取 \(a-a_k\)
    • \(a<a_k,b=b_k\) :互换两堆后可转化为 \((b_k,a)=(b_k,b_i)\) 的情况,而 \(a^{'}=b_k=a_k+k>a+k>a-i=b_i-i=a_i\) ,所以转化为了 \(a^{'}>a_i,b=b_i\) 的情况,也就是上一种情况,按之前的策略转化即可

    综上,命题得证

由命题2,3可得我们构造的奇异局势满足先手必输,这一构造策略是正确的

那么如何快速判断一个局势是否是奇异局势呢?这需要引入 beatty定理

  • \(a,b\) 是正无理数且 \(\frac{1}{a}+\frac{1}{b}=1\) ,记 \(P=\{\lfloor na \rfloor\mid n \in \mathbb{Z^+}\},Q=\{\lfloor mb \rfloor\mid m \in \mathbb{Z^+}\}\) ,则 \(P\cup Q=\mathbb{N^*},P\cup Q=\emptyset\)

证明:

\(\frac{1}{a}+\frac{1}{b}=1\)\(a,b\) 为整数可得 \(a,b>1\)

所以 \(\lfloor(n+1)a\rfloor = \lfloor na+a\rfloor >\lfloor na\rfloor+1 > \lfloor na \rfloor\) ,所以任意整数最多在 \(P,Q\) 中出现一次,不会重复,满足集合的互异性

\(k\in P,k\in 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}\\ \Rightarrow\frac{n+m}{k+1}<\frac{1}{a}+\frac{1}{b}=1<\frac{n+m}{k}\\ \Rightarrow k<m+n<k+1 \]

\(m,n\) 是整数矛盾,所以 \(P\cap Q=\emptyset\)

\(k\not\in P\)\(k\not\in Q\) ,则有 \(\lfloor na\rfloor < k < \lfloor(n+1)a\rfloor,\lfloor mb\rfloor < k < \lfloor(m+1)b\rfloor\) ,进一步得到:

\[na<k\leq\lfloor(n+1)a\rfloor-1\\ \Rightarrow na<k<(n+1)a-1\\ \Rightarrow \frac{n}{k}<\frac{1}{a}<\frac{n+1}{k+1} \]

同理,有关于 \(b\) 的结论,两式相加得:

\[\frac{m+n}{k}<\frac{1}{a}+\frac{1}{b}<\frac{m+n+2}{k+1}\\ \Rightarrow m+n<k<k+1<m+n+2 \]

\(m+n+2\)\(m+n\) 之间只包含了一个整数,矛盾,所以 \(P\cup Q=\mathbb{N^*}\)

而代表奇异局势第一个和第二个数的集合 \(A,B\) 如果忽略 \(0\) ,也满足beatty定理的形式

所以 \(a_i\) 可以表示为 \(\lfloor ix\rfloor\)\(b_i\) 可以表示为 \(\lfloor ix\rfloor+i=\lfloor i(x+1)\rfloor\) ,所以有:

\[\frac{1}{x}+\frac{1}{x+1}=1,x=\frac{\sqrt5+1}{2} \]

巧妙之处在于,这正好是 黄金分割率

至此,我们得到了第 \(i\) 个奇异局势的通项公式:

\[(\lfloor\frac{\sqrt5+1}{2}i\rfloor,\lfloor\frac{\sqrt5+3}{2}i\rfloor) \]

代码

Luogu P2252

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

const double r = (sqrt(5.0) + 1.0) / 2.0;

int main()
{
    int a, b;
    cin >> a >> b;
    if(a < b)
        swap(a, b);
    cout << !(b == (int)((a - b) * r)) << endl;
    return 0;
}
posted @ 2022-02-14 18:25  f(k(t))  阅读(128)  评论(0编辑  收藏  举报