點此看題面
大致題意:給定兩個正整數,從\(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,他...