题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1525
题意:
两个正数a.b,每次操作,大的数可以减掉小的数的整数倍。能一个数变为0的人胜利,Stan是先手。
如果a==b.那么肯定是先手获胜。一步就可以减为0,b
如果a%b==0.就是a是b的倍数,那么也是先手获胜。
如果a>=2*b. 那么 那个人肯定知道a%b,b是必胜态还是必败态。如果是必败态,先手将a,b变成a%b,b,那么先手肯定赢。如果是必胜态,先手将a,b变成a%b+b,b.那么对手只有将这两个数变成a%b,b,先手获胜。
如果是b<a<2*b 那么只有一条路:变成a-b,b (这个时候0<a-b<b).这样一直下去看谁先面对上面的必胜状态。
所以假如面对b < a <2*b的状态,就先一步一步走下去。直到面对一个a%b==0 || a >=2*b的状态。
参考博客:http://www.cnblogs.com/kuangbin/p/3204627.html
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main() {
int n, m;
while(~scanf("%d %d", &n, &m), m + n) {
int turn = 1;
while(1) {
if(n < m) swap(n, m);
if(n % m == 0 || n > 2 * m) {
if(turn == 1) puts("Stan wins");
else puts("Ollie wins");
break;
}
else {
n -= m;
turn = -turn;
}
}
}
return 0;
}