P1290 【欧几里德的游戏】
真·做题全凭感性
从题目中很容易看出
这是一道\(Gcd\)的题
同时又结合了一些略略的博弈论(丢下锅跑真爽
我们看,辗转相减的\(a,b\)一共只有两种情况
- \(a-b<b,a>b\),就是\(a\)比\(b\)大,但是比$b \(的两倍小,这种情况时。我们的\)S\(和\)O$君就只能硬着头皮去舰减了。 
- \(a>2b\),就是a比b的二倍大。这时候我们的\(S\)和\(O\)君就需要ta们的大脑进行一波用命分析-1s,-1s。 
- PS:a b是变量 
因为\(a>2b\),所以我们的\(S\)和\(O\)君就可以有两种选择
- 将a减成小于b,就是进行辗转相除的过程。 
- 让位,就是在正常进行游戏的前提下,将现在的状态转移给对手(a>b or a < b)。 
- 通过上面两种骚操作,他肯定就能赢了。 
到此,我们就大体分析van了。
另外因为是\(S\)和\(O\)君都是极其聪明的(-1s,-1s,用命分析)
所以我们可以看做他们是已经知道自己做出选择后的结果的。
上代码
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
bool dfs(int a,int b,int who)
{
	if(b==0)//van的游戏结束
		return false;//当前人fail
	if(a/b==1)//第一种情况,只能硬着头皮上
		return !dfs(b,a-b,who^1);
	if(a/b>1)
	{
		/*if(dfs(b,a%b,who^1))//如果我们将a变成小于b的情况,然后对手赢了,我们就可以改命
			return true;//改命
		else
			return true;//如果对手输了,那是更好不过了
		ps:我这里写的有些不大严谨233*/
		return true;//上面的返回都是true
        //至于为什么可以怎么写,一方面是我们利用上面的归纳法总结出来的233
        //也可以这么想,拿到这种情况的人,是可以可以控制a,b的大小的。
        //也就是控制了游戏局数,就像你买了一个5000~6000的挂,神仙一样,为所欲为。(逃
	}
}
int main()
{
	int k;
	scanf("%d",&k);
	int a,b;
	while(k--)
	{
		scanf("%d%d",&a,&b);
		if(a<b)
			swap(a,b);//保证a>b
		if(dfs(a,b,1))//简单的判断,第三个参数其实没有的,只是我调试用的。
			printf("Stan wins\n");
		else
			printf("Ollie wins\n");
	}
}
P1290 【欧几里德的游戏】的更多相关文章
- P1290 欧几里德的游戏
		P1290 欧几里德的游戏 原本不想写的,但细节有些多qwq,还是放上吧. 假设a严格大于b 当a<b*2时,只有一种方法往下走:否则就可以有多种方法,并且一定至少有一种可以使自己必胜,因为可以 ... 
- 洛谷——P1290 欧几里德的游戏
		P1290 欧几里德的游戏 题目描述 欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的 ... 
- LUOGU P1290 欧几里德的游戏
		题目描述 欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的数的正整数倍,当然,得到的数 ... 
- P1290 欧几里德的游戏(洛谷)
		欧几里德的两个后代 Stan 和 Ollie 正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数 M 和 N,从 Stan 开始,从其中较大的一个数,减去较小的数的正整数倍,当然, ... 
- 洛谷P1290 欧几里德的游戏
		题目:https://www.luogu.org/problemnew/show/P1290 只要出现n>=2*m,就可以每次把较大的数控制在较小的数的一倍与二倍之间,则控制了对方的走法: 每次 ... 
- 题解 洛谷P1290 【欧几里德的游戏】
		这题没必要那么麻烦,只需要推理一下即可: 假设我们有两个数\(x,y\),先把\(x\)设为较大值,\(y\)设为较小值.现在分成三种情况: \(1\).若两数为倍数关系,操作的一方赢. \(2\). ... 
- 洛谷P1290欧几里德游戏
		题目地址 题目大意: 两个人st和ol博弈 有两个整数n,m 每次轮到一个人时候,需要选择用大的那个数减去小的那个数的倍数(不能减为负数) 最后得到0的为胜利者 思路: (以下讨论均在n<m的条 ... 
- luoguP1290 欧几里德的游戏 [博弈论]
		题目描述 欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的数的正整数倍,当然,得到的数 ... 
- LG1290 欧几里德的游戏
		https://www.luogu.com.cn/problem/P1290 博弈论游戏,用到mod. 辗转相除法的过程,会构成n种状态. 到达最后一个状态就赢了. 对于一次过程如果div>1那 ... 
随机推荐
- Win10家庭版组策略gpedit.msc的问题
			大家都认为,Windows家庭版中并不包含组策略,其实不然,它是有相关文件的,只是不让你使用而已.那么我们让系统允许你使用就好了.首先你需要在桌面上新建一个txt文本文档.然后将以下代码复制到这个新建 ... 
- ORACLE CBC LATCH 检查
			###############1.DB meet latch: cache buffers chains event from awr report ,check latch: cache buffe ... 
- HTML学习之基础
			HTML是网页的标记语言不是编程语言,有一些标记段组成.大小写不敏感,可以用常用的编辑器软件编写用浏览器打开即可 有不同的版本<!DOCTYPE html> <meta charse ... 
- MQTT学习之一
			一MQTT特性: 基于C/S,发布订阅(发布者服务器->云平台代理->订阅客户端)一对多结构,适用于低带宽高延时,基于TCP/IP之上. 
- Git常用配置
			Git设置默认用户名和密码 1.进入C:\users\Administrator目录下,通过git bash终端输入touch .git-credentials后回车2.打开生成的.git-crede ... 
- 牛客网Java刷题知识点之什么是单例模式?解决了什么问题?饿汉式单例(开发时常用)、懒汉式单例(面试时常用)、单例设计模式的内存图解
			不多说,直接上干货! 什么是单例设计模式? 解决的问题:可以保证一个类在内存中的对象唯一性,必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性. 如何保证? 1.不允许其他程序用new ... 
- Windows下Redis数据库管理工具(redis-desktop-manager)安装与配置(图文详解)
			Redis Desktop Manager安装 Redis Desktop Manager直接下载安装就行非常简单.下载地址: 官网下载:https://redisdesktop.com/downlo ... 
- 【转】Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
			转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761 记得在前面的文章中,我带大家一起从源码的角度分析了Android中Vi ... 
- 深入理解vertical-align和line-height的关系
			vertical-align的百分比值不是相对于字体大小或者其他什么属性计算的,而是相对于line-height计算的.举个简单的例子,如下CSS代码: { line-height: 30px; ve ... 
- 模糊查询(like)
			1. 找出名中包含 “厂”的所有供应商的名select * from provider where pro_name like '%厂%'2.第二个字为华select * from provider ... 
