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; }