威佐夫博弈
威佐夫博弈是一類經典的博弈問題
有兩堆石子,兩個頂尖聰明的人在玩遊戲,每次每個人可以從任意一堆石子中取任意多的石子或者從兩堆石子中取同樣多的石子,不能取得人輸,分析誰會獲得勝利
博弈分析
威佐夫博弈不同於Nim遊戲與巴什博奕,它的特殊之處在於不能將兩堆石子分開分析。
前輩們在對該博弈遊戲做了大量的探索之後最終找到了一些非常有意思的性質
下面的內容不想看的可以跳過直接看結論,其實也沒啥亂用233,這部分就是為了拓寬視野的
定義先手必輸的局勢為奇異局勢,前幾個奇異局勢為\((0,0),(1,2),(3,5),(4,7),(6,10) \dots\)
假設\((x,y)\)為第\(k\)個奇異局勢
性質:
- \(x\)為前\(1 \dots k\)個奇異局勢中沒有出現過的最小正整數,\(y=x+k\)
打表找規律
- 任何一個自熱數都包含在一個且僅有一個奇異局勢中
感覺網上證的都不靠譜,那隻好讓本蒟蒻親自下手嘍
證明這個結論,我們只需要證明兩點:(1)任意自然數都出現過(2)任意自然數僅出現一次
對於(1):反證法,設\(v\)這個數沒有出現過,那麼\(v\)可以做一個新的奇異局勢的\(x\)
對於(2): 反證法
假設數\(v\)出現了兩次,那麼\(v\)一定不是所在奇異局勢的\(x\)(\(x\)必須之前未出現)
那麼\(v\)只能同時是兩個奇異局勢的\(y\),又因為任意一個奇異局勢的差值不相同,因此\(v\)不可能出現兩次
- 任何操作都會將奇異局勢變為非奇異局勢
若取走一堆中的石子,那麼兩對石子的差值會改變,必將成為非奇異局勢
若同時取走,因為同一個差值只會對應一種奇異局勢,必將成為非奇異局勢
- 可以採取適當的方法將非奇異局勢變為奇異局勢
顯然
結論
人們通過對上述性質的探索,同時結合Betty定理,給出了威佐夫博弈的重要結論
假設兩堆石子為\((x,y)\)(其中\(x<y\))
那麼先手必敗,當且僅當
\((y-x)*\frac{(\sqrt{5}+1)}{2}=x\)
其中的\(\frac{(\sqrt{5}+1)}{2}\)實際就是\(1.618\),黃金分割數!怎麼樣,博弈論是不是很神奇?
證明的話,
首先你要會證明Betty定理,連結在上面,如果度孃的證明看不懂可以看這裡
威佐夫博弈結論的話可以看這裡
程式碼
#include<cstdio>
#include<algorithm>
#include<cmath>
#define int long long
using namespace std;
main()
{
int a,b;
scanf("%lld%lld",&a,&b);
if(a>b) swap(a,b);
int temp=abs(a-b);
int ans=temp*(1.0+sqrt(5.0))/2.0;
if(ans==a) printf("0");
else printf("1");
return 0;
}