傳送門
肯定是博弈論啦
因為大家都"完美地操作"
所以結果是肯定的
那考慮怎樣先手才能控制必勝局面
設大的數是 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,他...