POJ 2348 Euclid's Game【博弈】
题目链接:
http://poj.org/problem?id=2348
题意:
给定两个数,两个人每次从较大数中减去较小数的倍数,谁先得到0谁获胜,为谁赢?
分析:
令一种可能出现的整数对为
b−a<a ,只能从b 中减去一个a ,得到状态(b−a,a) ,那么如果(b−a,a) 是必胜态的话,(a,b) 就是必败态,反之同理。b−a>a ,可以从b 中减去至少2个a ,假设可以从b 中最多可以减去x 个a ,那么从b 中减去(x−1) 个a 后得到状态(a,b−(x−1)∗a) ,此时即为讨论的第一种情况。如果状态(a,b−(x−1)∗a) 为必败态的话,那么(a,b) 就是必胜态,如果状态(a,b−(x−1)∗a) 为必胜态的话,那么(b−x∗a,a) 肯定是必败态,所以直接减去x 倍的a ,得到必败态,那么(a,b) 即为必胜态。
代码:
#include<iostream>
using namespace std;
int main (void)
{
int a, b;
while(cin>>a>>b && a + b){
bool res = true;
if(a > b) swap(a, b);
while(a != 0){
if(b % a == 0 || b - a > a) break;
b -= a;
res = !res;
if(a > b) swap(a, b);
}
if(res) cout<<"Stan wins"<<endl;
else cout<<"Ollie wins"<<endl;
}
return 0;
}