欧几里德的游戏
Posted 鄉勇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了欧几里德的游戏相关的知识,希望对你有一定的参考价值。
题目描述
欧几里德的两个后代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”
输入输出样例
输入样例#1:
2 25 7 24 15
输出样例#1:
Stan wins Ollie wins
最優策略是 大減小 ,不要被樣例解釋誤導,而後直接模擬就行,
為了提一下速度,找出兩組必勝態,一:大數能被小數整除;二:大數和小數互質。
代碼實現:
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 long long c,n,m; 5 bool p=1; 6 int main(){ 7 cin>>c; 8 while(c--){ 9 cin>>n>>m;p=1; 10 while(1){ 11 if(n>m) swap(n,m); 12 if(m%n==0||m-n>n) break; 13 m-=n; 14 p=!p; 15 } 16 if(p) printf("Stan wins\n"); 17 else printf("Ollie wins\n"); 18 } 19 return 0; 20 }
今天考試題,直接騙分了(我才不是懶),40。。。
以上是关于欧几里德的游戏的主要内容,如果未能解决你的问题,请参考以下文章