Euclid's Game题解

这是一道比较简单的博弈论。

我们假设 \(x \ge y\),那么此时可以分两种情况讨论:

  • \(x < 2y\)

此时我们只能取走 \(y\) 个石子,那么当前状态的后继即为 \((y,x-y)\)

  • \(x \ge 2y\)

此时设 \(k= \lfloor \frac{x}{y} \rfloor\),那么当前状态的后继状态即为 \((x-ny,y)\),其中 \(n \le k\),这个时候我们可以发现这个状态是必胜态。

考虑证明这个结论,假设 \((x-ny,y)\) 为必败态,那么 \((x,y)\) 就是必胜态,而如果 \((x-ny,y)\) 是必胜态,那么 \((x-(n-1)y,y)\) 就是必败态,这样也可以推出 \((x,y)\) 是必胜态。

这样的话,我们只需进行递归求解即可。

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
	int f=1,w=0;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')	f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		w=(w<<1)+(w<<3)+(c^48);
		c=getchar();
	}
	return f*w;
}
int x,y;
int dfs(int x,int y){
	if(x>=2*y||x==y){
		return 1;
	}
	return !(dfs(y,x-y));
}
signed main(){
	while(cin>>x>>y){
		if(x==0&&y==0)	break;
		if(x<y)	swap(x,y);
		int fl=dfs(x,y);
		if(fl)	printf("Stan wins\n");
		else	printf("Ollie wins\n");
	}
	return 0;
}

posted @ 2023-09-08 09:49  OIer_xxx2022  阅读(34)  评论(0编辑  收藏  举报