ZJU1913

/*
一个很有意思的问题。初看好像不好做。
在看,可以转化是取石子问题。
因为对于任意一堆数a,b。大的可能是小的好几倍,所以从a上取b可以取多个,然后才能转化为以b为大,a%b为小的下一堆。问题可以转化为:
若干堆石子,最后一堆只有一个石子,现在要求从左开始取,只有前一堆取完才能取下一堆。谁取到最后一个石子算胜。
可以使用必胜态必败态来做。
假设石子数量是

1 4 5 1
从右往左推,1是必胜态,因为轮到自己的时候,可以执行一步操作就到达要求的目标。
            5是必胜态,因为我可以只取4个,然后剩下一个给对方,然后就可以转到下一个必胜态。
			4是必胜态,因为我可以只取3个,然后剩下的一个对对方,然后就可以转到下一个必胜态
			1是必败态,因为无论怎么操作,都会转化到必胜态。
*/

#include <cstdio>
#include <algorithm>
using namespace std;

int A,B,ans;
int d[30],top;
bool pn[30];

int gcd(int a,int b)
{
	if(a%b==0)
	{
		d[top++] = 1;
		return b;
	}
	else
	{
		d[top++] = a/b;
	}
	return gcd(b,a%b);
}

int main()
{
	while(scanf("%d %d",&A,&B)==2)
	{
		if(A+B==0) break;
		top = 0;
		gcd(max(A,B),min(A,B));
		pn[top-1] = 1;
		for(int i=top-2;i>=0;i--)
		{
			if( pn[i+1] )
			{
				if( d[i]>1 ) pn[i] = 1;
				else pn[i] = 0;
			}
			else
			{
				pn[i] = 1;
			}
		}

		if( pn[0] ) printf("Stan wins\n");
		else printf("Ollie wins\n");
	}
	return 0;
}
posted @ 2011-06-16 11:01  AC2012  阅读(232)  评论(0编辑  收藏  举报