Euclid's Game
HDU - 1525题意:两个数a,b; 每次用a,b中较大的数减去较小的数的倍数, 知道其中一个数减为0, 该回合操作人胜出;
问给出两个数, 先手胜还是后手胜;
假设a>b;
1, a%b==0时,先手胜;
2,a-b>2*b时,先手可以判断 b,a%b是必胜态还是必败态, 如果是必胜态他可以将下一回合置为a%d+b, b;如果是必败态他就把下回合置为b,a%b; 所以这种情况下先手胜;
3,a-b<2*b时,就一步一步的走直到遇到1,2两种情况再做出判断;
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int a, b, maxn, minn;
while(scanf("%d%d", &a, &b), a&&b){
maxn=max(a, b);
minn=min(a, b);
if(maxn%minn==0||maxn-minn>2*minn) cout << "Stan wins\n";
else{
int k=1;
while(1){
int t=maxn-minn;
maxn=minn;
minn=t;
k=!k;
if(maxn%minn==0||maxn-minn>2*minn) break;
}
if(k) cout << "Stan wins\n";
else cout << "Ollie wins\n";
}
}
return 0;
}