歐幾里得遊戲
阿新 • • 發佈:2018-11-28
試題描述:
歐幾里德的兩個後代Stan和Ollie在玩一個數字遊戲,給定兩個正整數M和N,從Stan開始,取其中較大的一個數,減去較小的數的正整數倍,當然,得到的數K不能小於0。然後是Ollie,對剛才得到的數K以及M和N中較小的那個數,再進行同樣的操作,直到一個人得到了0,他就取得了勝利。下面是他們用(25,7)兩個數遊戲的過程:
開始:25 7
Stan:11 7 {18 7, 11 7, 4 7均有可能}
Ollie:4 7
Stan:4 3
Ollie:1 3
Stan:1 0
Stan最後獲得了勝利
現在,假設兩個人都能完美地進行操作,誰會取得最終的勝利呢?
輸入:
第一行輸入測試資料組數C
以下C行,每行一組資料,包含兩個正整數M和N,M和N的範圍不超過long long範圍。
輸出:
對每組輸入輸出一行。
如果Stan勝利,則輸出“Stan wins”;否則輸出“Ollie wins”。
輸入輸出
2
25 7
24 15
Stan wins
Ollie wins
分析:如果輸入中較小的已經為零,則為Ollie wins。如果n<m*2,則只有一種選擇——繼續遞迴。如果大的不止一倍,那就有多種選擇,簡單來說,如果(n%m,m)可以,那就(n%m,m),否則(n%m+m,m),這樣下一個人就必輸,自己也贏了。
#include<bits/stdc++.h> usingnamespace std; int t, m, n; bool solve(int n, int m) { if (!m) return false; if (n/m==1) return !solve(m, n%m); else return true; } int main() { scanf("%d", &t); for (int i=1;i<=t;i++) { scanf("%d%d", &n, &m); if (solve(max(n,m),min(n,m))) printf("Stan wins\n"); else printf("Ollie wins\n"); } }