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的更多相关文章

  1. 洛谷 [P1290] 欧几里得的游戏

    SG函数的应用 看到这题就想到了SG函数 那么可以考虑最终情况:一个数是x,另一个是0,那么先手必败(因为上一个人已经得到0了,其实游戏已经结束了) 剩下的情况:一个数n, 一个数m,假设n>m ...

  2. 洛谷P1290 欧几里得的游戏

    题目描述 欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的数的正整数倍,当然,得到的数 ...

  3. AC日记——欧几里得的游戏 洛谷 P1290

    题目描述 欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的数的正整数倍,当然,得到的数 ...

  4. 【Luogu】P1516青蛙的约会(线性同余方程,扩展欧几里得)

    题目链接 定理:对于方程\(ax+by=c\),等价于\(a*x=c(mod b)\),有整数解的充分必要条件是c是gcd(a,b)的整数倍. ——信息学奥赛之数学一本通 避免侵权.哈哈. 两只青蛙跳 ...

  5. hdu 5512 Pagodas 扩展欧几里得推导+GCD

    题目链接 题意:开始有a,b两点,之后可以按照a-b,a+b的方法生成[1,n]中没有的点,Yuwgna 为先手, Iaka后手.最后不能再生成点的一方输: (1 <= n <= 2000 ...

  6. [P1082][NOIP2012] 同余方程 (扩展欧几里得/乘法逆元)

    最近想学数论 刚好今天(初赛上午)智推了一个数论题 我屁颠屁颠地去学了乘法逆元 然后水掉了P3811 和 P2613 (zcy吊打集训队!)(逃 然后才开始做这题. 乘法逆元 乘法逆元的思路大致就是a ...

  7. 浅谈扩展欧几里得[exgcd] By cellur925

    关于扩展欧几里得从寒假时就很迷,抄题解过了同余方程,但是原理并不理解. 今天终于把坑填上了qwq. 由于本人太菜,不会用markdown,所以这篇总结是手写的(什么).(字丑不要嫌弃嘛) ****** ...

  8. [BZOJ1965][AHOI2005] 洗牌 - 扩展欧几里得

    题目描述 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打 ...

  9. NOIP2012拓展欧几里得

    拉板题,,,不说话 我之前是不是说过数据结构很烦,,,我想收回,,,今天开始的数论还要恶心,一早上听得头都晕了 先来一发欧几里得拓展裸 #include <cstdio> void gcd ...

随机推荐

  1. php+memcache高速缓存

    原文地址:https://blog.csdn.net/qq_33571752/article/details/86494667 #在lnmp基础上修改 依赖libevent程序库 cd lnmp/ta ...

  2. mysql存储过程demo

    #删除存储过程 -- drop procedure if exists add_test; CREATE PROCEDURE add_test() begin #定义变量 declare client ...

  3. charles Windows 安装

    本文参考:charles Windows 安装 在实际开发.测试中需要通过代理截取 app 的网络请求报文来快速定位问题.https 双向认证的 app 越来越多,fiddler在这方面并不好用.由于 ...

  4. idea查看接口及类的关系继承(UML)图

    选中接口或类 显示结果: 如果需要添加其他的接口或类:点击右键 添加需要的接口或类: 显示结果:

  5. scrapy,Twisted,pywin32安装

    安装包链接   百度云下载    https://pan.baidu.com/s/1V191nOtEDInxd_fkyi5siQ&shfl=sharepset Linux pip3 insta ...

  6. burpsuite破解网页密码

    1.暴力破解网页登录 http://jingyan.baidu.com/article/200957619c8739cb0721b4ff.html https://zhuanlan.zhihu.com ...

  7. docker 搭建私有 docker hub

    查找registry 镜像 meiya@meiya:/etc/docker$ clear meiya@meiya:/etc/docker$ docker search registry NAME DE ...

  8. es原理

    一:  一个请求到达es集群,选中一个coordinate节点以后,会通过请求路由到指定primary shard中,如果分发策略选择为round-robin,如果来4个请求,则2个打到primary ...

  9. 第五章 模块之 getpass、sys、os

    5.5 getpass 密码不显示(只能在终端运行) 密码不显示(只能在终端运行) import getpass​pwd = getpass.getpass('请输入密码:')if pwd == '1 ...

  10. Python--递归函数实现:多维嵌套字典数据无限遍历

    原创:多层嵌套字典无限遍历,实现当value值以特殊字符$开头,并且等于某项值时,用随机函数替换该参数 """处理前的字典{'patient': {'avatarPic' ...