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