HDU 2348

DFS+博弈。

假设存在两数(x,y),且x<y。对于(x+ky,y)k>=2,只能转移向两种状态(x+y,y),或者(x,y)。而对于(x+y,y)只能向(x,y)转移,那么,可知,无论(x,y)为败点还是胜点,(x+ky,y)只能为胜点。于是,DFS搜索一下,就可以知道了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
int m,n;

bool work(int m,int n){
	if(m/n>1||m%n==0) return true;
	bool flag=work(n,m%n);
	return !flag;
}

int main(){
	while(scanf("%d%d",&m,&n),m||n){
		if(m<n){
			int tmp=m;
			m=n;
			n=tmp;
		}
		bool flag=work(m,n);
		if(flag)
		puts("Stan wins");
		else puts("Ollie wins");
	}
	return 0;
}

  

posted @ 2015-04-06 19:55  chenjunjie1994  阅读(132)  评论(0编辑  收藏  举报