博弈论模型:威佐夫博弈(Wythoff's game)

问题

有若干个石子被分成两个石子堆,两人轮流操作。

每次操作可以在任意的一堆中取走任意多的石子或在两堆中同时取走相同数量的石子,不可以不取。

无法操作者败。问先手是否有必胜策略。

一些约定

我们用形如 \((p_0,p_1)\) 的二元组来表示目前的局势,\(p_0,p_1\) 即两堆石子的数量。

定义「奇异局势」表示,对于先手必败的局势。

叙述

试枚举前若干项「奇异局势」:

  • \((0,0)\) 显然是「奇异局势」。令其为第 \(0\) 项。

  • \((1,2)\) 是「奇异局势」。先手无论怎样取,后手总是可以使用一次操作将石子取光。

  • \((3,5)\) 是「奇异局势」。先手无论怎样取,后手总是可以使用一次操作将局势变成前 \(2\) 种「奇异局势」。

  • \((4,7)\) 是「奇异局势」。先手无论怎样取,后手总是可以使用一次操作将局势变成前 \(3\) 种「奇异局势」。

  • \((6,10)\) 是「奇异局势」。先手无论怎样取,后手总是可以使用一次操作将局势变成前 \(4\) 种「奇异局势」。

\(S_u\) 表示前 \(u\) 项中出现的所有数的集合。容易发现性质:

对于「奇异局势」的第 \(i\)\((n,m)\),满足 \(i=n-m\)\(n=\mathrm{mex}(S_{i-1})\)

显然地,全体正整数被所有「奇异局势」划分成了两个无交集的集合 \(A\)\(B\)

发现相邻的「奇异局势」\((n_0,m_0),(n_1,m_1)\) 具有特征 \(|n_0-n_1|\le 2\)

我们可以将第一堆表示为 \(\lfloor cx \rfloor\) 的形势。那么第二堆又可以被表示为 \(\lfloor (c+1)x \rfloor\) 的形势。其中 \(c\) 为一个无理数且 \(x\) 为正整数。

于是联想到 \(\mathrm{Beatty}\) 定理:

定义一个正无理数的 Beatty 列 \(\mathfrak{B}_k\) 为:\(\mathfrak{B}_k=\lfloor k\rfloor,\lfloor 2k\rfloor,\lfloor 3k\rfloor,...=(\lfloor nk\rfloor)_{n\ge 1}\)
\(\mathfrak{B}_p=(\lfloor np\rfloor)_{n\ge 1},\mathfrak{B}_q=(\lfloor nq\rfloor)_{n\ge 1}\) 构成正整数集的一个分划:\(\mathfrak{B}_p \cap \mathfrak{B}_q=\varnothing,\mathfrak{B}_p \cup \mathfrak{B}_q=\mathbb{Z}^+\)

\(\mathrm{Beatty}\) 定理,\(\frac{1}{c}+\frac{1}{c+1}=1\)。解得 \(c=\frac{1+\sqrt{5}}{2}\)

结论

由上述易得。

设两堆石子中较多的石子堆数量为 \(x\),较少的石子堆数量为 \(y\)

\(k=x-y\)。若 \(x=\lfloor\frac{1+\sqrt{5}}{2}k\rfloor\),先手必败。否则,先手必胜。

习题

P2252 【模板】威佐夫博弈 是一道模板题。

Code

/* ChongYun */
#include<bits/stdc++.h>
#define ldb long double
using namespace std;
long long a,b;
signed main(){
    scanf("%lld%lld",&a,&b);
    if(a>b) swap(a,b);
    long long u=b-a;
    int now=((int)((sqrt((ldb)5.0)+1.0)/2.0*u));
    if(a==now) puts("0");
    else puts("1");
    return 0;
}
posted @ 2025-02-22 22:20  HAM_qwq  阅读(113)  评论(0)    收藏  举报