题目给出了两个正数a.b
每次操作,大的数减掉小的数的整数倍。一个数变为0 的时候结束。
谁先先把其中一个数减为0的获胜。问谁可以赢。Stan是先手。
假设两个数为a,b(a>=b)
如果a==b.那么肯定是先手获胜。一步就可以减为0,b
如果a%b==0.就是a是b的倍数,那么也是先手获胜。
如果a>=2*b. 那么 那个人肯定知道a%b,b是必胜态还是必败态。如果是必败态,先手将a,b变成a%b,b,那么先手肯定赢。如果是必胜态,先手将a,b变成a%b+b,b.那么对手只有将这两个数变成a%b,b,先手获胜。
如果是b<a<2*b 那么只有一条路:变成a-b,b (这个时候0<a-b<b).这样一直下去看谁先面对上面的必胜状态。
所以假如面对b < a <2*b的状态,就先一步一步走下去。直到面对一个a%b==0 || a >=2*b的状态。
#include <cstdio>
#include <string>
#include <cstring>
#include <queue>
#include <algorithm>
#include <functional>
#include <vector>
#include <iomanip>
#include <cmath>
#include <iostream>
#include <sstream>
#include <stack>
#include <set>
#include <bitset>
using namespace std;
int main()
{
int a, b;
cin.sync_with_stdio(false);
while (cin >> a >> b)
{
if (a == 0 && b == 0)
break;
if (a < b)
swap(a, b);
int win = 0;
while (b)
{
if (a % b == 0 || a / b >= 2)
break;
a = a - b;
swap(a, b);
win ^= 1;
}
if (win == 0)
cout << "Stan wins\n";
else
cout << "Ollie wins\n";
}
return 0;
}
HDU 1525 Euclid's Game 博弈论
最新推荐文章于 2020-07-02 13:21:21 发布