POJ 1067 取石子遊戲

2022-09-07 09:15:12 字數 1230 閱讀 2015

題意:有兩堆個數分別為a和b的石子,兩個人輪流取石子,一次可以取一堆中任意個數的石子,或者在兩堆中取相同個數的石子,最先沒有石子可以取的人輸,你先取,贏為1輸為0。

解法:威佐夫博弈。看完題先找規律,能推理出前幾個必敗態有1 2, 3 5, 4 7, 6 10……從必敗態可以一步達到的狀態一定是必勝態,所以在找規律中發現,在必敗態的a或b上加若干數,或a和b同時加若干數,就會轉化為必勝態,所以下乙個必敗態不可能會有乙個數量和之前的必敗態相同,所以下乙個必敗態的a就是在之前的必敗態內沒出現過的第乙個整數,而對於必敗態a和b同時加若干數就轉化為必勝態的情況,前乙個必敗態的a和b的差設為k,那麼下乙個必敗態的差為k + 1時就不會轉化為必勝態了,所以得出an和bn的求法,但這題的資料範圍太大,不能將所有必敗態求出,在這裡用到了貝亞蒂定理:

在數論中,貝亞蒂定理(英文:beatty sequence)指:若使得

。定義集(貝亞蒂列

,則p 和 q 構成正整數集的乙個分劃:

,。即是說:若兩個正無理數的倒數之和是1,則任何正整數都可剛好以一種形式表示為不大於其中乙個無理數的正整數倍的最大整數。

此定理由sam beatty在2023年發現。

——維基百科

通過之前的描述,數列an和bn符合貝亞蒂數列,即兩者沒有交集,且並集為正整數集。

由貝亞蒂定理可知,an = [np], bn = [nq], 且bn = an + n, 所以bn = np + n = n(p + 1),即q = p + 1,解方程1 / p + 1 / (p + 1) = 1得p = (1 + sqrt(5)) / 2。

所以當給出a和b(a < b)時, n = b - a,若(1 + sqrt(5)) / 2 × n等於a,則說明為必敗態。

**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long

using namespace std;

int main()

int n = b - a;

if((int)((1 + sqrt(5.0)) * 0.5 * n) == a)

else

puts("1");

}return 0;

}

POJ 1067 取石子遊戲

取石子遊戲 time limit 1000ms memory limit 10000k total submissions 25862 accepted 8199 description 有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆...

POJ 1067 取石子遊戲

威佐夫博奕。思路 我們用 ak,bk ak bk k 0,1,2,n 表示兩堆物品的數量並稱其為局勢,如果甲面對 0,0 那麼甲已經輸了,這種局勢我們稱為奇異局勢。前幾個奇異局勢是 0,0 1,2 3,5 4,7 6,10 8,13 9,15 11,18 12,20 可以看出,a0 b0 0,ak是...

poj 1067 取石子遊戲

description 有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子 二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。現在給出初始的兩堆石子的數目,如果輪到你先取,假設雙方都採取最好的策略,問最...