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;
}

浙公网安备 33010602011771号