题意
Stan和Ollie玩游戏,Stan先手。给出两个数字,可以用大数减去小数的整数倍,要求不能减到小于0。谁先将一个数字减到0,谁获胜。
思路
博弈
假设 a > b
比赛的时候想到了关于a - b > b ( a > 2 * b )状态下,可以决定必胜、必败态,故若a > 2 * b为必胜态。
若a%b == 0, a可以减去b的整数倍变为0,故谁达到这个状态即必胜态
但是当时没考虑周全,这里应该用循环求解,谁达到必胜态则退出循环。
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int a, b;
while( scanf("%d%d", &a, &b) == 2 && a && b ){
if( a < b ) swap(a, b);
bool first = true;
for(;;){
if( a % b == 0 || a > 2 * b ) break;
a -= b;
swap(a,b);
first = !first;
}
if( first ) puts("Stan wins");
else puts("Ollie wins");
}
return 0;
}