P1290 歐幾里德的遊戲 博弈,SG

2021-08-28 10:29:50 字數 904 閱讀 3128

start:25 7

stan:11 7

ollie:4 7

stan:4 3

ollie:1 3

stan:1 0

stan贏得了遊戲的勝利。

現在,假設他們完美地操作,誰會取得勝利呢?

思路:感覺這題很像尼姆博弈的變形,同樣都是n堆石子任意拿,但是尼姆博奕是在任意一堆拿石子,而這個必須一堆一堆地拿,拿完這一堆才能拿下一堆.

然後我們這樣想,假設當前堆誰拿了最後乙個誰就必輸,那麼肯定希望把最後乙個留給對方.所以假如我是先手,假如當前堆只有1個,那麼我只能乖乖地拿了,必輸.假如有兩個,我肯定只拿乙個,假如有三個我肯定拿兩個, 這一點又很像巴什博奕,所有只要大於乙個我就能贏.同理假如當前堆誰拿了最後乙個誰就必贏,我是先手的話我肯定一次就拿完,所以無論有多少堆,只要當前堆大於乙個先手必勝.

那麼怎麼知道當前堆拿最後乙個是贏還是輸,遞迴求解即可,假如n/m == 1,那麼sg(n,m) = !sg(m,n%m),而sg(m,n%m)又能繼續按照此規則判斷,假如n/m> 1,則直接為必勝態.

**:

#include#define mem(a,b) memset(a,b,sizeof(a))

using namespace std;

typedef long long ll;

const ll mod = 1e9+7;

const int maxn = 2e5+5;

const double eps = 1e-12;

const int inf = 0x3f3f3f3f;

map::iterator it;

ll a,b;

int get_sg(ll x,ll y)

int main()

return 0;

}

P1290 歐幾里德的遊戲

原題鏈結 模擬賽的一道題,我大眼一看是博弈論的題,想都沒想直接跳過 我完全不會博弈論 看了題解之後發現其實並不難 直接看結論 記當前狀態為 d x,y 且 x y 若此時 x 2y 則目前的操作者勝利 下面是證明 假定 x ky r 其中 r x y k x y 根據假設,k 2 此時討論 d y,...

P1290 歐幾里德的遊戲

歐幾里德的兩個後代stan和ollie正在玩一種數字遊戲,這個遊戲是他們的祖先歐幾里德發明的。給定兩個正整數m和n,從stan開始,從其中較大的乙個數,減去較小的數的正整數倍,當然,得到的數不能小於0。然後是ollie,對剛才得到的數,和m,n中較小的那個數,再進行同樣的操作 直到乙個人得到了0,他...

P1290 歐幾里德的遊戲

傳送門 肯定是博弈論啦 因為大家都 完美地操作 所以結果是肯定的 那考慮怎樣先手才能控制必勝局面 設大的數是 a,另乙個數是b 如果把數變成 b,a b的局面必勝 那先手肯定走這一步,先手必勝 如果b,a b的局面必輸 那先手就要盡量避免,而且要盡量讓後手變成不得不取成b,a b的必輸局面 考慮怎樣...