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. 获取两日期之前集合并转为String类型的集合

    /** * 获取两个日期之间的日期 * * @param start 开始日期 * @param end 结束日期 * @return 日期集合 */ private static List<D ...

  2. 2019年Java面试题基础系列228道,题目汇总,可以先看会多少

    Java面试题(一) 1.面向对象的特征有哪些方面? 2.访问修饰符 public,private,protected,以及不写(默认)时的区别? 3.String 是最基本的数据类型吗? 4.flo ...

  3. uinxSocket 与 tcpSocket

    $tpc = stream_socket_client('unix:///tmp/php-cgi.sock');nginx配置中可以用uninx:/tmp/php-.....这种格式,也可用直接uin ...

  4. vmware linux 硬盘空间不足时增加硬盘并挂载

    不同的版本的vmware在设置界面中可能稍有不同,基本是一致的. 还有一种方式是扩展,这里没有记录,扩展时需要在虚拟机关机状态下. 1.选择在vmware中点击设置并打开,将光标定位在hard Dis ...

  5. 谈谈redis的热key问题如何解决

    引言 讲了几天的数据库系列的文章,大家一定看烦了,其实还没讲完...(以下省略一万字).今天我们换换口味,来写redis方面的内容,谈谈热key问题如何解决.其实热key问题说来也很简单,就是瞬间有几 ...

  6. lnmp二级域名配置相关

    阿里云那域名解析那有误读 我在偏远的电信网选择中国联通解析死活解析不出来 以上这么配置就对了....选择默认.瞬间解析出来.... 出于对nginx 配置不够熟悉 后来一点点理出来. 不带www 也正 ...

  7. 剑指offer48:不用加减乘除做加法

    1 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 2 思路和方法 位运算符:两个数异或(^)[1^0=1, 1^1=0, 0^0=0, 0^1=1, 5^5 ...

  8. 字典的学习3——嵌套——Python编程从入门到实践

    嵌套 ? 一系列字典存储在列表or列表作为值存储在字典or字典中套字典 1. 字典列表 alien_0 = {'color': 'green', 'points': 5} alien_1 = {'co ...

  9. HCIA SWITCHING&ROUTTING 笔记——第一章 TCP/IP基础知识(2)

    视频地址:https://ilearningx.huawei.com/courses/course-v1:HuaweiX+EBGTC00000336+Self-paced/courseware/abb ...

  10. Oracle部分

    做了很多年Oracle,转行到MySQL了,算是借鉴 Oracle日常维护管理指标 一. 基本硬件环境 1. 主机硬件环境 品牌 型号 数量 物理CPU核数及逻辑CPU数 内存大小 本地硬盘大小 光驱 ...