洛谷1290 歐幾里德的遊戲(博弈論)

2021-08-26 05:09:55 字數 1857 閱讀 4425

點此看題面

大致題意:給定兩個正整數,從sta

nstan

stan

開始,每次將兩個數中較大的數減去較小數的正整數倍(得到數不能小於0),然後是oll

ie

ollie

olli

e進行同樣操作。若誰先得到0誰就勝利,請你求出誰會取得勝利。

分類討論

這一看就是博弈論題。

我們可以用w(x

,y

)w(x,y)

w(x,y)

來表示兩個數分別為x

xx和y

yy時的獲勝情況(設x≥y

x≥yx≥

y),並設a=⌊

xy⌋,

b=

xa=\lfloor\frac xy\rfloor,b=x

a=⌊yx​

⌋,b=

x%yy

y。下面是一波分類討論:

綜上所述,此時的決策者必勝。

如果a

<

2a<2

a<

2 這時,我們不能直接看出此時決策者是否必勝或必輸,這時候就需要遞迴了,因為此時的決策只有一種(將x

xx減去y

yy),因此此時的獲勝情況就是!w(

y,x−

y)

!w(y,x-y)

!w(y,x

−y)。

遞迴函式w(x,y)

這樣一來,就不難得出乙個遞迴函式w(x

,y

)w(x,y)

w(x,y)

了:

inline

boolw(

int x,

int y)

//遞迴函式,判斷兩個數分別為x和y,且x≥y時是否必勝

**
#include

#define max(x,y) ((x)>(y)?(x):(y))

#define min(x,y) ((x)<(y)?(x):(y))

#define abs(x) ((x)<0?-(x):(x))

#define ll long long

#define ull unsigned long long

#define swap(x,y) (x^=y,y^=x,x^=y)

#define tc() (a==b&&(b=(a=ff)+fread(ff,1,100000,stdin),a==b)?eof:*a++)

#define pc(ch) (pp_<100000?pp[pp_++]=ch:(fwrite(pp,1,100000,stdout),pp[(pp_=0)++]=ch))

#define n 20

int pp_=0;

char ff[

100000],

*a=ff,

*b=ff,pp[

100000];

using

namespace std;

int n,m;

inline

void

read

(int

&x)inline

void

ps(string x)

inline

boolw(

int x,

int y)

//遞迴函式w(x,y)

intmain()

return

fwrite

(pp,

1,pp_,

stdout),

0;}

洛谷1290 歐幾里德的遊戲(博弈論)

點此看題面 大致題意 給定兩個正整數,從 stan 開始,每次將兩個數中較大的數減去較小數的正整數倍 得到數不能小於0 然後是 ollie 進行同樣操作。若誰先得到0誰就勝利,請你求出誰會取得勝利。這一看就是博弈論題。我們可以用 w x,y 來表示兩個數分別為 x 和 y 時的獲勝情況 設 x y ...

洛谷1290 歐幾里德的遊戲

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

洛谷P1290 歐幾里德的遊戲

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