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

2022-05-14 15:20:52 字數 1312 閱讀 2342

點此看題面

大致題意:給定兩個正整數,從\(stan\)開始,每次將兩個數中較大的數減去較小數的正整數倍(得到數不能小於0),然後是\(ollie\)進行同樣操作。若誰先得到0誰就勝利,請你求出誰會取得勝利。

這一看就是博弈論題。

我們可以用\(w(x,y)\)來表示兩個數分別為\(x\)和\(y\)時的獲勝情況(設\(x≥y\)),並設\(a=\lfloor\frac xy\rfloor,b=x\)%\(y\)。

下面是一波分類討論:

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

如果\(a<2\)

這時,我們不能直接看出此時決策者是否必勝或必輸,這時候就需要遞迴了,因為此時的決策只有一種(將\(x\)減去\(y\)),因此此時的獲勝情況就是\(!w(y,x-y)\)。

這樣一來,就不難得出乙個遞迴函式\(w(x,y)\)了:

inline bool w(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 bool w(int x,int y)//遞迴函式w(x,y)

int main()

return fwrite(pp,1,pp_,stdout),0;

}

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

點此看題面 大致題意 給定兩個正整數,從sta nstan stan 開始,每次將兩個數中較大的數減去較小數的正整數倍 得到數不能小於0 然後是oll ie ollie olli e進行同樣操作。若誰先得到0誰就勝利,請你求出誰會取得勝利。分類討論 這一看就是博弈論題。我們可以用w x y w x,...

洛谷1290 歐幾里德的遊戲

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

洛谷P1290 歐幾里德的遊戲

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