Euclid's Game HDU - 1525(博弈)

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


猜你喜欢

转载自blog.csdn.net/sirius_han/article/details/80410034