1. 程式人生 > 其它 >博弈論——威佐夫博弈原理與證明

博弈論——威佐夫博弈原理與證明

簡介

威佐夫博弈的定義是:

有兩堆若干個物品,兩人輪流從某一堆物品中取至少一個或同時從兩堆中取相同數量的物品,不能不取,最後把物品全部取完者勝利

現在給出兩堆物品的數量 \(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;
}