1. 程式人生 > >歐幾里得遊戲

歐幾里得遊戲

試題描述:

歐幾里德的兩個後代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>
using
namespace 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"); } }