Luogu P1290 欧几里得的游戏/UVA10368 Euclid's Game
Luogu P1290 欧几里得的游戏/UVA10368 Euclid's Game
对于博弈论的题目没接触过多少,而这道又是比较经典的SG博弈,所以就只能自己来推关系……
假设我们有两个数$m,n$,我们先把$m$设为较大值,$n$设为较小值。现在我们把它分成三种情况:
1.若两数为倍数关系,当前操作的一方赢。
2.若$m \div n>1$,那么还是操作一方赢。
为什么呢?
拿$(25,7)$来举例。这时的操作方就有三种选择:$(8,7)$,$(11,7)$,$(4,7)$,
如果他选$(18,7)$,那后者就面对的是$(11,7)$或$(4,7)$;而如果他不选$(18,7)$,那么他面对的还是$(11,7)$或$(4,7)$。
此时我们会发现,$(11,7)$和$(4,7)$是必有一个能赢的,而两人都会选择最优策略,所以谁有选择权谁就能赢,也就是说他不能选$(18,7)$。
所以易知,谁有选择权谁就能赢。
3.商为$1$,则继续
举个例子,如$(6,4)$,这时先手没有选择权,那就只能继续,如$(2,4)$。
综上所述,那么代码也就很容易写了。
(两道题的读入略微有些不同)
Luogu P1290
#include<bits/stdc++.h>
using namespace std;
int c,m,n;
bool Judge(int m,int n) {
int p=0;
while(1) {
p++;
int mmax=max(m,n),mmin=min(m,n);
m=mmax;
n=mmin;
if(m%n==0||m/n>1) {
return p%2;
}
else {
m-=n;
}
}
}
int main()
{
scanf("%d",&c);
for(int i=1;i<=c;i++) {
scanf("%d%d",&m,&n);
if(Judge(m,n)==1) {
printf("Stan wins\n");
}
else {
printf("Ollie wins\n");
}
}
return 0;
}
UVA10368
#include<bits/stdc++.h>
using namespace std;
int c,m,n;
bool Judge(int m,int n) {
int p=0;
while(1) {
p++;
int mmax=max(m,n),mmin=min(m,n);
m=mmax;
n=mmin;
if(m%n==0||m/n>1) {
return p%2;
}
else {
m-=n;
}
}
}
int main()
{
while(scanf("%d%d",&m,&n)&&(m!=0&&n!=0)) {
if(Judge(m,n)==1) {
printf("Stan wins\n");
}
else {
printf("Ollie wins\n");
}
}
return 0;
}
Luogu P1290 欧几里得的游戏/UVA10368 Euclid's Game的更多相关文章
- 洛谷 [P1290] 欧几里得的游戏
SG函数的应用 看到这题就想到了SG函数 那么可以考虑最终情况:一个数是x,另一个是0,那么先手必败(因为上一个人已经得到0了,其实游戏已经结束了) 剩下的情况:一个数n, 一个数m,假设n>m ...
- 洛谷P1290 欧几里得的游戏
题目描述 欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的数的正整数倍,当然,得到的数 ...
- AC日记——欧几里得的游戏 洛谷 P1290
题目描述 欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的数的正整数倍,当然,得到的数 ...
- 【Luogu】P1516青蛙的约会(线性同余方程,扩展欧几里得)
题目链接 定理:对于方程\(ax+by=c\),等价于\(a*x=c(mod b)\),有整数解的充分必要条件是c是gcd(a,b)的整数倍. ——信息学奥赛之数学一本通 避免侵权.哈哈. 两只青蛙跳 ...
- hdu 5512 Pagodas 扩展欧几里得推导+GCD
题目链接 题意:开始有a,b两点,之后可以按照a-b,a+b的方法生成[1,n]中没有的点,Yuwgna 为先手, Iaka后手.最后不能再生成点的一方输: (1 <= n <= 2000 ...
- [P1082][NOIP2012] 同余方程 (扩展欧几里得/乘法逆元)
最近想学数论 刚好今天(初赛上午)智推了一个数论题 我屁颠屁颠地去学了乘法逆元 然后水掉了P3811 和 P2613 (zcy吊打集训队!)(逃 然后才开始做这题. 乘法逆元 乘法逆元的思路大致就是a ...
- 浅谈扩展欧几里得[exgcd] By cellur925
关于扩展欧几里得从寒假时就很迷,抄题解过了同余方程,但是原理并不理解. 今天终于把坑填上了qwq. 由于本人太菜,不会用markdown,所以这篇总结是手写的(什么).(字丑不要嫌弃嘛) ****** ...
- [BZOJ1965][AHOI2005] 洗牌 - 扩展欧几里得
题目描述 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打 ...
- NOIP2012拓展欧几里得
拉板题,,,不说话 我之前是不是说过数据结构很烦,,,我想收回,,,今天开始的数论还要恶心,一早上听得头都晕了 先来一发欧几里得拓展裸 #include <cstdio> void gcd ...
随机推荐
- UML学习笔记:类图
UML学习笔记:类图 有些问题,不去解决,就永远都是问题! 类图 类图(Class Diagrame)是描述类.接口以及它们之间关系的图,用来显示系统中各个类的静态结构. 类图包含2种元素:类.接口, ...
- web端自动化——python多线程
Python通过两个标准库thread和threading提供对线程的支持.thread提供了低级别的.原始的线程以及一个简单的锁.threading基于Java的线程模型设计. 锁(Lock)条件变 ...
- 【C/C++开发】C++库大全
C++特殊限定符(1)--static 当static来修饰类数据成员时,这个类的所有对象都可以访问它.因为值在内存中持续存在,它可以被对象有效共享.这意味着当一个对象改变static数据成员的值时, ...
- HTTP权威指南-概述
URI 统一资源标识符 类似于邮件地址,邮箱. URL 统一资源定位符 URN 统一资源名 HTTP方法 get post put delete post head 状态码 200 OK 302 重定 ...
- [tomcat] 连接池参数maxActive、maxIdle 、maxWait 等
maxActive 连接池支持的最大连接数,这里取值为20,表示同时最多有20个数据库连接.设 0 为没有限制.maxIdle 连接池中最多可空闲maxIdle个连接 ,这里取值为20,表示即使没有数 ...
- 如何在mongoengine中使用referencefield引用本类
引用:原文 from mongoengine import * class Employee(Document): name = StringField() boss = ReferenceField ...
- MySQL中的case when 中对于NULL值判断的坑
sql中的case when 有点类似于Java中的switch语句,比较灵活,但是在Mysql中对于Null的处理有点特殊 Mysql中case when语法: 语法1: CASE case_val ...
- 如何实现在H5里调起高德地图APP
这一篇文章将告诉您,如果直接打开高德地图APP,并展示路线规划.适合有定位的移动设备,可以查询到从“我的位置”到目的地的路径规划,并直接导航. 场景二.调起高德地图的路线规划功能 导航是目前JSAPI ...
- Linux Nginx的权限——访问本地目录报错403
在安装好FastDFS并成功上传图片文件后,根据FastDFS返回的文件地址无法通过HTTP(即浏览器)访问到,报错404或者403. 不管是Error 404还是Error 403,基本都是Ngin ...
- Math.random()的加密安全替换方法window.crypto.getRandomValues
Math.random() 返回介于 0(包含) ~ 1(不包含) 之间的一个随机数. Math.random()函数不是加密安全的随机数生成器. window.crypto.getRandomVal ...