P1290 歐幾里德的遊戲

2022-05-13 12:07:42 字數 1533 閱讀 2170

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

start:25 7

stan:11 7

ollie:4 7

stan:4 3

ollie:1 3

stan:1 0

stan贏得了遊戲的勝利。

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

輸入格式:

第一行為測試資料的組數c。下面有c行,每行為一組資料,包含兩個正整數m, n。(m, n不超過長整型。)

輸出格式:

對每組輸入資料輸出一行,如果stan勝利,則輸出「stan wins」;否則輸出「ollie wins」

輸入樣例#1:

2

25 7

24 15

輸出樣例#1:

stan wins

ollie wins

設先手勝利與否為d(a,b),不妨設a>=b。

由「乙個狀態必勝當且僅當它的有至少乙個後繼狀態必敗」可以列出:

當a-b>b時,d(a,b)=(not d(a-b,b)) or (not d(a-2b,b)) or ... or (not d(a mod b,b)),

此時又有d(a-b,b)=(not d(a-2b,b)) or (not d(a-3b,b)) or ... or (not d(a mod b,b)),

代入得到d(a,b)=(not d(a-b,b)) or d(a-b,b)=true。

當a-b=b時,顯然d(a,b)=true。

當a-bb,有且只有一種決策,即d(a,b)=not d(b,a-b),若a=b,有d(a,b)=true。

將遞迴改為迴圈(實際意義為模擬每一局的策略)即可(資料水,也可以不改)。

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8const

int maxn=5001;9

void read(int &n)

1014

while(c>='

0'&&c<='9'

)15

16 flag==1?n=-x:n=x;17}

18int

main()

1937

if(now)

38 printf("

stan wins\n");

39else

40 printf("

ollie wins\n");

41}4243

return0;

44 }

P1290 歐幾里德的遊戲

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

P1290 歐幾里德的遊戲

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

洛谷P1290 歐幾里德的遊戲

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