题意:给你a , b两个数,总是用大的数减去小的数的x倍,若能使其中一个数减完后为0,则该玩家获胜。
思路:
首先(设a>b), 若 a / b = 1 那么若 a%b==0,则第一个玩家获胜,但如果a % b !=0 ,那么局面变为: b , a%b(此时不能简单判断胜负。)
若a / b >=2 那么 第一个玩家总是能选择对自己有利的局势:(1)若 a % b==0 则 a - (a/b)*b==0 ,获胜。(2) 若a % b!=0 ,且 b%(a%b)==0,则将a减去(a/b -1)倍b,那么第二个玩家只能被动选择将局势变为 a%b b ,玩家一获胜。若 a % b!=0 且 b%(a%b)!=0,则局面回到最初,因为玩家足够聪明,所以总能选择利于自己的局势即 是自己面对 a , b (其中a /b >=2),这样才能使自己取得 主动地位,从而获胜。
代码:
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int a, b;
while(scanf("%d%d",&a,&b)!=EOF && a+b )
{
if(a<b) swap(a , b);
bool flag=1;
while(1)
{
if(b==0 || a%b==0 || a/b>=2 ) break;
a-=b;
int t=a;
a=b; b=t;
flag=!flag;
}
if(flag) printf("Stan wins\n");
else printf("Ollie wins\n");
}
return 0;
}