P1290 歐幾里德的遊戲

2022-05-20 02:52:32 字數 1207 閱讀 5736

傳送門

肯定是博弈論啦

因為大家都"完美地操作"

所以結果是肯定的

那考慮怎樣先手才能控制必勝局面

設大的數是 a,另乙個數是b

如果把數變成 b,a%b的局面必勝

那先手肯定走這一步,先手必勝

如果b,a%b的局面必輸

那先手就要盡量避免,而且要盡量讓後手變成不得不取成b,a%b的必輸局面

考慮怎樣才有不得不 取成b,a%b的必輸局面

顯然如果  a < 2 * b

就只能 變成 b,a-b,即b,a%b

如果先手時的 a >=2 * b

那麼先手只要把 a 減到 a%b+b 就能保證必勝(顯然只要減若干個 b ,a 就可以變成 a%b+b)

如果先手面對的是 a< 2 * b的局面...

那就只能減了...

那此時就成了 b , a%b的局面,而且是後手的回合了..

相當於現在後手成了先手,面對 b,a%b 的局面

然後繼續判斷下去就好了

複雜度log(a)...

講一下複雜度的證明吧,不想聽也可以跳過...

如果 a >= 2*b,那就結束了

否則 a < 2*b 所以 a/2 < b  

那減完一次,顯然只能減乙個b,不然就變成了負數了

因為 a/2 < b,a/2 = a - a/2

所以 a - b < a - a/2 = a/2

即  每次減後 a 至少除以 2

所以最多只要log( a ) 次就能得出結果....

注意一下剛開始 a=b 的情況特判一下

#include#include

#include

#include

#include

using

namespace

std;

long

long

n,m;

intnum;

intmain()

while(n<2*m)//如果n>=2*m,那麼結果就確定了

if(!(num&1)) cout<<"

stan wins

"

ollie wins

"<}

return0;

}

P1290 歐幾里德的遊戲

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

P1290 歐幾里德的遊戲

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

洛谷P1290 歐幾里德的遊戲

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