原题网址:
http://acm.hdu.edu.cn/showproblem.php?pid=1525
思路:
假设现在的状态为(a,b),假设 a > b 不管怎么走,肯定会走到(b,a%b)。
1,如果a == b,那么到达这个状态的人获胜。
2,如果b < a <2 * b时,那么只能通过一种方法走。
3,如果 a >= 2*b,这时可以选择奇数走或者偶数走,但不管怎么走,始终要走到(b,a%b),而这个状态是确定必胜或必败态(可以从最后的结束状态向前推),所以先遇到 a >= 2*b 的人获胜。
4,如果一直都遇不到。。。那就一步一步模拟到最后吧。。。(笑)
ac代码:
#include <iostream>
#include <cstdio>
using namespace std;
int ans;
void f(int a,int b){
ans++;
if(a==0 || b==0)return;
if(a / b > 1 || a == b){
return;
}
return f(b,a%b);
}
void swap(int &a,int &b){
a ^= b;
b = a^b;
a ^= b;
}
int main()
{
int m,n;
while(cin>>m>>n,n){
if(m < n)swap(m,n);
f(m,n);
if(ans % 2 == 1)
puts("Stan wins");
else
puts("Ollie wins");
ans = 0;
}
return 0;
}