SG函数的应用

看到这题就想到了SG函数

那么可以考虑最终情况:一个数是x,另一个是0,那么先手必败(因为上一个人已经得到0了,其实游戏已经结束了)

剩下的情况:一个数n, 一个数m,假设n>m

那么根据题意,SG(n,m)=mex{SG(n - m, m), SG(n - 2m, m), ......, SG(m, n%m)(此处交换了顺序,因为 m>n%m )}

考虑里面的SG怎么求。

可以发现,SG(n-m, m)=mex{SG(n-2m, m), SG(n-3m, m)........SG(m, n%m)}

SG(n- 2m, m)同理

所以除了SG(m, n%m)以外的SG都可以由SG(m, n%m)得来

假设SG(m, n%m)0,设n/m=k, SG(n-(k-1)*m,m)mex{SG(m, n%m)}=1

从此往上一直到SG(n, m)的值为2,3,4,5...,即一直必胜,简单记为1

如果SG(m, n%m)1, 那么 SG(n-(k-1)*m,m)mex{SG(m, n%m)}=0

剩下的依旧为2,3,4,5,6...,也可记为1

那么可以看出,如果n/m==1,SG(n, m)=!SG(m, n%m),不然是1

这是一个标准的辗转相除的一个递推式,用GCD的写法即可实现

归纳一下用SG函数解决博弈问题的一般步骤:

  1. 找到终止状态
  2. 找出任意一个状态,并把它的SG的值用它的后继表示
  3. 化简SG之间的关系,递归求解

直观的理解一下本题

首先题目的描述让我们感觉本题与GCD肯定有某些联系

我们发现如果在一个人的手里, \(a > 2b\) 那么这个人必胜,因为他可以选择是在自己进入下一步,还是对手进入下一步

所以第一个出现这个情况的人必胜,如果始终都没有这种情况,就GCD计数

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
using namespace std;
int init() {
int rv = 0, fh = 1;
char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') fh = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
rv = (rv<<1) + (rv<<3) + c - '0';
c = getchar();
}
return fh * rv;
}
int n, a, b;
bool SG(int a, int b) {
if(!b) return 0;
if(a / b == 1) return !SG(b, a % b);
return 1;
}
int main() {
freopen("in.txt", "r", stdin);
n = init();
for(int i = 1 ; i <= n ; i++) {
a = init(); b = init();
if(SG(max(a, b), min(a, b))) {
printf("Stan wins\n");
}else printf("Ollie wins\n");
}
fclose(stdin);
return 0;
}

洛谷 [P1290] 欧几里得的游戏的更多相关文章

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

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

  2. Luogu P1290 欧几里得的游戏/UVA10368 Euclid's Game

    Luogu P1290 欧几里得的游戏/UVA10368 Euclid's Game 对于博弈论的题目没接触过多少,而这道又是比较经典的SG博弈,所以就只能自己来推关系-- 假设我们有两个数$m,n$ ...

  3. 【洛谷P2584】【ZJOI2006】GameZ游戏排名系统题解

    [洛谷P2584][ZJOI2006]GameZ游戏排名系统题解 题目链接 题意: GameZ为他们最新推出的游戏开通了一个网站.世界各地的玩家都可以将自己的游戏得分上传到网站上.这样就可以看到自己在 ...

  4. 洛谷P1290欧几里德游戏

    题目地址 题目大意: 两个人st和ol博弈 有两个整数n,m 每次轮到一个人时候,需要选择用大的那个数减去小的那个数的倍数(不能减为负数) 最后得到0的为胜利者 思路: (以下讨论均在n<m的条 ...

  5. 【洛谷3345_BZOJ3924】[ZJOI2015]幻想乡战略游戏(点分树)

    大概有整整一个月没更博客了 -- 4 月为省选爆肝了一个月,最后压线进 B 队,也算给 NOIP2018 翻车到 316 分压线省一这个折磨了五个月的 debuff 画上了一个不算太差的句号.结果省选 ...

  6. BZOJ5285 & 洛谷4424 & UOJ384:[HNOI/AHOI2018]寻宝游戏——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5285 https://www.luogu.org/problemnew/show/P4424 ht ...

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

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

  8. 洛谷P3052 [USACO12MAR]摩天大楼里的奶牛 [迭代加深搜索]

    题目传送门 摩天大楼里的奶牛 题目描述 A little known fact about Bessie and friends is that they love stair climbing ra ...

  9. 洛谷P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper

    P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper 题目描述 A little known fact about Bessie and friends is ...

随机推荐

  1. 如何在ABAP里用函数式编程思想打印出非波拉契Fibonacci(数列)

    在JavaScript里可以用ES6提供的FunctionGenerator这种黑科技来打印非波拉契数列,具体细节参考我这篇文章. 在ABAP里也有很多种方式实现这个需求. 下面这个report分别用 ...

  2. gson对象的相互转换

    参见 http://www.javacreed.com/gson-deserialiser-example/

  3. 基于docker搭建wordpress博客网站平台

    WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. WordPre ...

  4. PHP 腾讯云cos使用之我见

    因为某些人的原因,本文从新改名发布一遍. 原名称:tp5 -- 腾讯云cos简单使用 原文链接:https://www.cnblogs.com/YFYQ/p/10840050.html 因项目需要,本 ...

  5. Bootstrap 原始按钮

    Bootstrap 原始按钮 <!DOCTYPE html><html><head><meta http-equiv="Content-Type&q ...

  6. Bootstrap 静态控件

    当您需要在一个水平表单内表单标签后放置纯文本时,请在 <p> 上使用 class .form-control-static. 实例: <!DOCTYPE html><ht ...

  7. MySql中引擎

    1. InnoDB 引擎 MySQL 5.5 及以后版本中的默认存储引擎,它的优点如下:灾难恢复性好,支持事务,使用行级锁,支持外键关联,支持热备份. InnoDB引擎中的表,其数据的物理组织形式是簇 ...

  8. mybatis 批量操作增删改查

    在介绍批量操作之前,首先先介绍一个语法:foreach.可以说是,foreach是整个批量操作的灵魂. 属性 描述 item 循环体中的具体对象. 支持属性的点路径访问,如item.age,item. ...

  9. Immutable 特性

    https://io-meter.com/2016/09/03/Functional-Go-persist-datastructure-intro/ 持久化的数据结构(Persistent Data ...

  10. WIN10配置MAVEN

    添加新的系统环境变量M2_HOME, 并设置其值为你安装的目录MAVEN_HOME=D:\Softwares\apache-maven-3.2.2. 更新系统PATH 变量, 添加;%M2_HOME% ...