题目:欧几里德的游戏
思路:
不妨设两数A>=B(如果不是手动swap)。
假如A<2B,这一轮时只可能有一种选择方案,就是A'=A-B,且此时A'一定小于B
而当A>=2B时,有多种选择方案,那么此时选择的人就可以每次都把另一个人的选择限制在一个自己能赢的状态中。
所以,当A<2B时,就模拟这个过程,只要出现了A>=2B的情况,那么此时选择的人就一定会赢。
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int T;
scanf("%d",&T);
while(T--) {
int a,b;
scanf("%d%d",&a,&b);
bool ans=1;
if(a<b) swap(a,b);
if(a>=2*b) {
ans=0;
goto tag;
}
while(b!=0) {
ans^=1;
if(a>=2*b) goto tag;
a-=b;
swap(a,b);
}
tag: if(ans==0) printf("Stan wins\n");
else printf("Ollie wins\n");
}
return 0;
}