链接:

P2252 [SHOI2002]取石子游戏|【模板】威佐夫博弈


前言:

第一眼大水题,第二眼努力思考,第 N 眼我是大水逼。


题意:

不看题目标题都应该能看出来是取石子类的博弈论。

有两堆石子,可以在任意一堆取走任意正整数的石子,也可以同时在两堆中取走相同任意正整数的石子。判断当前状态。


分析:

这就是大名鼎鼎的威佐夫博弈了。

本着不会正解就暴力打表的思想,我们可以打出暴力,这其实是解决本题的关键所在。在暴力中我们可以发现只有以下状态先手必败: \((0,0),(1,2),(3,5),(4,7),(6,10),(8,13)\cdots\)于是我们从这些状态入手,定义这样的状态为奇异局势

设第 \(k\) 个奇异局势为二元组 \((a_k,b_k)\),且 \(0\leq k\)。

首先容易发现的是,\(b_k=a_k+k\)。记为性质 \(1\)。

不容易发现的是,\(a_k=\operatorname{mex}(a_1,b_1,a_2,b_2,\cdots,a_{k-1},b_{k-1})\),即 \(a_k\) 是以前从未出现过的自然数中最小数。记为性质 \(2\)。

能够发现这两个性质就又离成功更进一步,再来思考从这两个性质出发能得到的其他性质。


性质 \(3\):任意自然数都包含在一个,且仅有一个的奇异局势中。

分开证明,需要证明两点:

1,所有自然数都被包含。2,除零外所有自然数只出现了一次。

1证起来很简单,由性质 \(2\) 即可知任何不被包含的自然数都可以作为一个奇异局势的 \(a\)。显然不会有没有被包含的自然数。

再证2,,因为有性质 \(2\):

\(a_k\) 是以前从未出现过的自然数中最小数。

显然有 \(a_k>a_{k-1}\),有由性质 \(1\),有 \(b_k=a_k+k\)

所以 \(b_k=a_k+k>a_{k-1}+k-1=b_{k-1}\),即 \(b_k>b_{k-1}\)

所以有:

\(\begin{cases}a_k>a_{k-1}\\b_k>b_{k-1}\\b_{k-1}>a_{k-1}\\b_k>a_k\end{cases}\)

观察后发现,对于 \(a_k,b_k,a_{k-1},b_{k-1}\),只有 \(a_k\) 有可能等于 \(b_{k-1}\),其他数之间都有明确的大小关系,不可能相等,又根据性质 \(2\),\(a_k\neq b_{k-1}\),所以奇异局势中除了 \((0,0)\) 是不会有其他自然数出现两次的。


性质 \(4\):奇异局势的所有后继状态都不是奇异局势。

这个也比较好证,因为后继状态只能是把 \(a\) 或 \(b\) 减小,且上面谈到过有 \(a_k>a_{k-1},b_k>b_{k-1}\) ,所以假设要转移到奇异局势,只能同时减小 \(a,b\) 。这样后继状态 \(a,b\) 差值不会变,但奇异局势的差值是递增的,所以转移后不可能是另一个奇异局势。


性质 \(5\):所有非奇异局势都能转移到奇异局势:

考虑现在的非奇异局势为 \((a,b)\),且 \(a<b\)。

设\(b=a+k\),那么

当 \(a>a_k\) 时,只需 \(a,b\) 同时减去 \(a-a_k\) 就能转移到第 \(k\) 个奇异局势。

当 \(a=a_k\) 时,不是非奇异局势,不在考虑范围。

当 \(a<a_k\) 时,显然无法转移到 \(k\) 以上的奇异局势,考虑转移到 \(k\) 以下的奇异局势。如果 \(a,b\) 同时减或者只减少 \(a\),差值变大,发现是无法转移到小于奇异局势的。只能减小 \(b\) 。由于性质 \(3\),结合 \(a<a_k\),此时的 \(a\) 一定在 \(k\) 以下的奇异局势中出现过,设 \(a\) 出现在第 \(m\) 个奇异局势中,且 \(m<k\)。

当 \(a=a_m\) 时,考虑将 \(b\) 转移到 \(b_m\),由于

\(\begin{cases}b_m=a_m+m\\b=a+k\\a=a_m\\k>m\end{cases}\)

所以 \(b>b_m\) ,将 \(b\) 减小 \(k-m\) 即可转移到第 \(m\) 个奇异局势。

当 \(a=b_m\) 时,考虑将 \(b\) 转移到 \(a_m\),由于 \(b>a=b_m\geq a_m,\)

所以 \(b>a_m\),显然也是可以转移的。


结合性质 \(4\) 和 \(5\) 和我们得到的暴力例子,我们终于发现,奇异局势中先手必败,非奇异局势中先手必胜。真是艰辛,但对这道题只是打好了基础,题目现在需要我们判断它是否是奇异局势。

由于第 \(k\) 个奇异局势中 \(b_k=a_k+k\),所以根据给出的 \(a,b\) 的差值,找到第 \(k\) 个奇异局势的 \(a\) 或 \(b\) ,比较一下就可以了。如果暴力递推对于 \(a,b\leq1,000,000,000\) 的数据还是过不了的。所以需要方法来更快速地判断。

这里我们又用到一个神奇的定理:beatty(贝蒂)定理

设 \(a,b\) 是正无理数且 \(\dfrac{1}{a}+\dfrac{1}{b}=1\)。记\(P=\{\lfloor na\rfloor |n为任意正整数\},Q=\{\lfloor nb\rfloor |n为任意正整数\}\),则 \(P\) 与 \(Q\) 是 \(\mathbb{N^+}\) 的一个划分,即 \(P\cap Q=\varnothing\) 且 \(P\cup Q=\mathbb{N^+}\) (正整数集)。

在性质 \(3\) 中我们发现所有正整数都出现且仅出现了一次,所以奇异局势的 \(a,b\) 就把所有正整数分成了两个不相交的部分,这刚好满足 beatty定理,所以设第 \(k\) 个奇异局势中的 \(a=\lfloor kt\rfloor\),其中 \(k\) 是正整数,\(t\) 是一个无理数,则 \(b=a+k=\lfloor k(t+1)\rfloor\),由 beatty定理即可得到:

\(\dfrac{1}{t}+\dfrac{1}{t+1}=1\)

解一元二次分式方程得:

\(t_1=\dfrac{1+\sqrt5}{2},t_2=\dfrac{1-\sqrt5}{2}\)

\(t\) 取正,所以 \(t=\dfrac{1+\sqrt5}{2}\)

所以第 \(k\) 个奇异局势中的 \(a=\lfloor kt\rfloor=\lfloor k\times\dfrac{1+\sqrt5}{2}\rfloor\)。

这样就能快速判断了。

这是博弈论中的经典题目,最好跟着或者自己推一遍过程,代码短也不能只背代码。


代码:
#include<bits/stdc++.h>
using namespace std;
double d=(1+sqrt(5))/2;
signed main(){
int a,b;
cin>>a>>b;
if(a>b)swap(a,b);
int t=b-a;
if(int((double)t*d)==a)cout<<0;
else cout<<1;
return 0;
}

洛谷 P2252 [SHOI2002]取石子游戏|【模板】威佐夫博弈的更多相关文章

  1. POJ.1067 取石子游戏 (博弈论 威佐夫博弈)

    POJ.1067 取石子游戏 (博弈论 威佐夫博弈) 题意分析 简单的威佐夫博弈 博弈论快速入门 代码总览 #include <cstdio> #include <cmath> ...

  2. 「LuoguP2252」 取石子游戏(威佐夫博弈

    [P2252]取石子游戏 - 洛谷 题目背景 无 题目描述 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以 ...

  3. 【POJ1067】取石子游戏 (威佐夫博弈)

    [题目] Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的 ...

  4. HDU 1527 取石子游戏 (威佐夫博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是 ...

  5. poj 1067 取石子游戏 (威佐夫博弈)

    取石子游戏 http://poj.org/problem?id=1067 Time Limit: 1000MS   Memory Limit: 10000K       Description 有两堆 ...

  6. hdu1527取石子游戏---(威佐夫博弈)

    感谢 http://www.cnblogs.com/yuyixingkong/p/3362476.html 取石子游戏 Time Limit: 2000/1000 MS (Java/Others)   ...

  7. 【POJ1067】取石子游戏(威佐夫博弈)

    题意:有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子. 游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子. 最后把石子全部取完 ...

  8. POJ-1067取石子游戏,威佐夫博弈范例题/NYOJ-161,主要在于这个黄金公式~~

    取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K              Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取 ...

  9. 题解报告:hdu 1527 取石子游戏(威佐夫博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527 Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石 ...

随机推荐

  1. LVS负载均衡集群--NAT模式部署

    目录: 一.企业群集应用概述 二.负载均衡群集架构 三.负载均衡群集工作模式分析 四.关于LVS虚拟服务器 五.NAT模式 LVS负载均衡群集部署 一.企业群集应用概述 1.群集的含义 Cluster ...

  2. 泛微OA E-cology(CNVD-2019-32204)远程命令执行漏洞复现分析

    漏洞复现 影响版本: E-cology 7.0 E-cology 8.0 E-cology 8.1 E-cology 9.0   直接在网站根目录后加入组件访问路径 /weaver/bsh.servl ...

  3. 【第二十篇】-Maven IntelliJ之Spring Cloud直播商城 b2b2c电子商务技术总结

    Maven IntelliJ IntelliJ IDEA 已经内建了对 Maven 的支持.我们在此例中使用的是 IntelliJ IDEA 社区版 11.1. IntelliJ IDEA 的一些特性 ...

  4. grep、cut、awk、sed的使用

    grep.cut.awk.sed 常常应用在查找日志.数据.输出结果等等,并对我们想要的数据进行提取.通常grep,sed命令是对行进行提取,cut跟awk是对列进行提取 处理海量数据之grep命令 ...

  5. PTA 面向对象程序设计 6-2 逆序字符串

    6-2 逆序字符串 设计一个void类型的函数reverse_string,其功能是将一个给定的字符串逆序.例如,给定字符串为"hello",逆序后为"olleh&quo ...

  6. Docker安装flink及避坑指南

    Docker安装flink 导航 无处不在的大数据 安装flink 拉取flink镜像 编写docker-compose.yml 生成启动 查看安装效果 常见坑及解决方案 问题1 问题2 参考   本 ...

  7. jquery获取一个元素符合条件的第一个父元素

    closest jQuery 1.3新增.从元素本身开始,逐级向上级元素匹配,并返回最先匹配的元素.. closest会首先检查当前元素是否匹配,如果匹配则直接返回元素本身.如果不匹配则向上查找父元素 ...

  8. 链式调用+对象属性与遍历+this指向+caller/callee

    之前的作业: 提示: 在开发的时候尽量在函数内部将作用都给调用好,在外部就能够直接使用 链式调用: 正常这样是不行的,因为没有具体返回值:  return 具体的对象,这样的才是链式操作,jquery ...

  9. 对象继承深入、call_apply、圣杯模式、构造函数和闭包,企业模块化

    一个实现加减乘除的插件:   原型其实是在构造函数之上的,构造函数变成实例化函数的时候才会有原型, 原型实际上是构造函数的一个属性 原型无非就是2个字:继承 原型中继承父类所有方法是很不合理的,因为没 ...

  10. 安装VM-TOOLS,解压tar包时提示目录磁盘空间不足

    在虚拟机里安装了ubuntu-18.04.4-desktop-amd64,安装VM-TOOLS,解压tar包时提示目录磁盘空间不足. 解决方法一: 打开terminal,输入:sudo apt ins ...