POJ 2348 Euclid's Game(简单博弈)
这道题没说a b最大多少,所以要声明为long long型,不然会WA!
道理很简单,(默认a>=b)a和b只有以下三种关系:
1.a%b==0 :这种关系下,可能是a/b为整数,也可能是a和b都为0,不论哪种,都会是先者胜;
2.a<2*b :这种关系下,下一步只能变成(a-b,b),故胜的几率是交替的(cnt++);
3.a>2*b :这种关系下,下一步总能变成(a,a%b)和(a,a%b+b)两种状态,而这两种状态又与第2种状态(a<2*b)相邻,故两种状态中必有一种处于必败状态,只要先者找到该状态即可,所以不论怎样,在这种关系下,先者一定胜。
#include<iostream> #include<cstdio> using namespace std; typedef long long ll; int main() { ll a,b; while(scanf("%I64d%I64d",&a,&b)&&a+b) { int cnt=0; while(1) { if(a<b) swap(a,b); if(a%b==0||a>(2*b)) break; a-=b; cnt++; } if(cnt%2==0) //a%b==0||a>(2*b)时Stan必胜,但在break前是Ollie必胜,那时cnt为偶 printf("Stan wins\n"); else printf("Ollie wins\n"); } return 0; }