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; }
时间: 2024-10-01 17:42:49