[博弈论]洛谷P1290

https://www.luogu.com.cn/problem/P1290

题意:
给定两个正整数M和N,从其中较大的一个数减去较小的数的正整数倍,先得到0的人获胜

思路:
类Nim游戏,根据判定引理推。
但这是先得到0的人获胜,所以先要找必败局面终局。
当前局面,两个数有一个数是0,那就是必败局面,因为这就对应着,上一个人已经取到0了。

假设某个局面(a,b)是必胜局面,a>b,那它的前驱局面(a+b,a)则是必败局面,因为只能指向必胜局面。
而所有(2a+b,a),(3a+b,a)都是必胜局面,因为他们虽然会指向(a,b)但也指向(a+b,a)这个必败局面,所以他们都是必胜局面。
假设某个局面(a,b)是必败局面,那所有(a+b,a),(2a+b,a)..这些都是必胜局面更不用说了。
看代码。

bool dfs(int a,int b){
	if(a < b) swap(a,b);
	if(b == 0) return 0;
	if(dfs(b,a%b) == 0 || a > 2 * b) return 1;
	return 0;
}
int t,a,b;
int main(){
	cin>>t;
	while(t--){
		cin>>a>>b;
		bool flag = dfs(a,b);
		if(flag) cout<<"Stan wins"<<endl;
		else cout<<"Ollie wins"<<endl;
	}
	return 0;
} 
posted @   Isaac233  阅读(55)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示