欧几里得游戏
试题描述:
欧几里德的两个后代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"); } }