題目描述
歐幾里德的兩個後代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」
樣例輸入225
72415
樣例輸出
stan wins
ollie wins
過程分析1
實驗舉例
1)在完美操作下,每個人都想讓自己贏。狀態2)題目中說的是減去正整數倍,那麼減去的倍數不同,最終贏的人也不同。那麼最終贏的人跟減去的倍數有沒有關係呢?以樣例 25 7為例
方案1方案2
方案325 7
25 7
25 7
stan
18 7
11 7
4 7ollie
11 7 或 4 7
4 74 3
stan
4 7 或 4 3
3 41 3
ollie
4 3 或 1 3
3 11 0
stan
1 3 或 1 0
0 1ollie獲勝
ollie
1 0 或 stan獲勝
stan獲勝
ollie獲勝
stan
ollie獲勝 或 stan獲勝
stan獲勝
ollie獲勝
標黃色的地方表示選擇方法有大於等於2種
從上表中的結果可以看出,當每次減的倍數大一倍時,贏得步驟會比上一次靠前一步,贏得人會跟上乙個人不一樣。
同時可以深入推測,奇數倍和奇數倍的結果一樣,偶數倍和偶數倍的結果一樣。
總體思路
所以我們可以推出,若到了某一步,這個人減數的方案有大於等於2種,那麼在完美操作下就是這個人贏。因為它減奇數倍若輸,那麼減偶數倍就能贏,反之也成立。也就是說他總能找到一種方,再給對方贏得機會前自己贏。
什麼是贏得機會?解題關鍵如果較大的數只能減去較小的數的一倍,那麼這個人有且只有一種選擇方案,他不能左右自己贏還是輸。如果較大的數能減去較小的數大於等於2倍,由上面得出,他就可以先決定自己贏還是輸。注意是先決定。
所以本題的答案是:
1、設m,n為輸入資料且m>n,第乙個滿足條件m-n>n的步驟所對應的人為勝利者
2、m%n==0時的步驟所對應的人為勝利者。
實驗**
flag =
0def
dfs(a, b, s)
:if a > b:
a = a^b
b = a^b
a = a^b
if b % a ==
0or b - a > a:
global flag
flag = s
return
dfs(a, b-a,
(s+1)%
2)if __name__ ==
'__main__'
: total =
int(
input()
)for i in
range
(total)
: a, b =
map(
int,
input()
.split())
dfs(a, b,1)
if flag ==1:
print
("stan wins"
)if flag ==0:
print
("ollie wins"
)
↩︎ 歐幾里德的遊戲
這題目好像輾轉相除。每次的兩個數 a b a b 分為兩種情況 一,此時狀態為 a b 1 那最完美的做法是取走 a b 1 b,那麼剩下的兩個數就為 a b b,b 對手唯一的做法就是取走b,剩下 b,a b 這樣就能保證每一次的初狀態都是由自己取,那等到 a b 0 時,就會獲勝。所以到這種初狀...
歐幾里德的遊戲
數論 題目描述 歐幾里德的兩個後代stan和ollie正在玩一種數字遊戲,這個遊戲是他們的祖先歐幾里德發明的。給定兩個正整數m和n,從stan開始,從其中較大的乙個數,減去較小的數的正整數倍,當然,得到的數不能小於0。然後是ollie,對剛才得到的數,和m,n中較小的那個數,再進行同樣的操作 直到乙...
歐幾里德的遊戲
歐幾里德的兩個後代stan和ollie正在玩一種數字遊戲,這個遊戲是他們的祖先歐幾里德發明的。給定兩個正整數m和n,從stan開始,從其中較大的乙個數,減去較小的數的正整數倍,當然,得到的數不能小於0。然後是ollie,對剛才得到的數,和m,n中較小的那個數,再進行同樣的操作 直到乙個人得到了0,他...