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;
}

最新文章

  1. java选择排序
  2. 关于odbc的彻底删除问题
  3. IIS 7 应用程序池自动回收关闭的解决方案
  4. 重写UIPageControl实现自定义按钮
  5. 个人博客转移到CSDN
  6. C++Primer 第二章
  7. bitmap的实现方法
  8. SlidesJS 3.0.4 在手机上遇到的一些问题及解决办法
  9. java的学习路线
  10. 创建oracle数据库的表空间、用户、目录、导入\导出文件等信息
  11. statsmodels.tsa.arima_model预测时报错TypeError: int() argument must be a string, a bytes-like object or a number, not &#39;Timestamp&#39;
  12. vue源码分析之目录架构(一)
  13. 软链接ln -s 总结
  14. sqlserver查询当前库下,一张表的表名,字段名,字段类型,字段长度
  15. 数据库的IO and 数据库优化问题
  16. 电子书 VS 纸质书
  17. SDK Manager 基础下载
  18. 2015-2016 Petrozavodsk Winter Training Camp, Nizhny Novgorod SU Contest (5/9)
  19. scpclient使用报错fchmod无法找到问题解决
  20. java学习-get和post请求

热门文章

  1. @AutoWired注解使用时可能会发生的错误
  2. myeclipse报错MA
  3. mac下只遍历目录不遍历文件
  4. 面向对象编程OOP-2
  5. softmax_loss.cu 和 softmax_loss.cpp源码
  6. 【414】Code::Blocks增加主题
  7. Java中集合类
  8. 268. Missing Number@python
  9. 【Java_基础】java中的多态性
  10. (59)zabbix拓扑图展示链路状况Link indicators