问题链接:POJ2348 UVa10368 HDU1525 Euclid's Game。
问题描述:参见上文。
问题分析:
这是一个博弈问题。有以下几个要点:
1.开始时,让a>b;
2.若a和b有0,则先手胜;
3.若a%b=0,则当前玩家胜;
4.若a/b>1,则当前玩家可以胜(当前玩家知道<b,a%b>是否必胜,若不是则将<a,b>变为<a%b,b>即可)
5.若b<a<2*b,则一步一步模拟下去。
程序说明:(略)
参考链接:(略)
AC的C++语言程序:
/* POJ2348 UVa10368 HDU1525 Euclid's Game */ #include <iostream> using namespace std; int main() { int a, b; while(cin >> a >> b && (a || b)) { bool Stanwins = true; if(a < b) swap(a, b); while(b) { if(a % b == 0 || a / b > 1) break; a = a - b; swap(a, b); Stanwins = !Stanwins; } if(Stanwins) cout << "Stan wins" << endl; else cout << "Ollie wins" << endl; } return 0; }