「LuoguP2252」 取石子游戏(威佐夫博弈
题目背景
无
题目描述
有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。
输入输出格式
输入格式:
输入共一行。
第一行共两个数a, b,表示石子的初始情况。
输出格式:
输出共一行。
第一行为一个数字1、0或-1,如果最后你是胜利者则为1;若失败则为0;若结果无法确定则为-1。
输入输出样例
说明
[数据范围]
50%的数据,a, b <= 1000
100%的数据,a, b <= 1 000 000 000
题解
裸的威佐夫博弈。
威佐夫博弈(Wythoff's game):有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。 ——百度百科
在威佐夫博弈中,有这样一种性质:
若当前为一个奇异局势,则先手必败;否则先手必胜。
其中奇异局势,是这样的一系列数对——
$(0,0),(1,2),(3,5),(4,7),(6,10),(8,13),(9,15),(11,18),(12,20)......$
观察可得,若设第$k$组奇异局势为$(a[k],b[k])$的话,那么有:
$1. b[k]==a[k]+k$
$2. a[k]$为这之前未出现过的数中最小的一个。
奇异局势有如下性质:
$1.$任何自然数都包含在一个且仅有一个奇异局势中。
由于$a[k]$是未在前面出现过的最小自然数,所以有$a[k] > a[k-1] $,而 $b[k]= a[k] + k > a[k-1] + k > a[k-1] + k - 1 = b[k-1] > a[k-1]$ 。所以性质$1$成立。
$2.$任意操作都可将奇异局势变为非奇异局势。
事实上,若只改变奇异局势$(a[k],b[k])$的某一个分量,那么另一个分量不可能在其他奇异局势中,所以必然是非奇异局势。如果使$(a[k],b[k])$的两个分量同时减少,则由于其差不变,且不可能是其他奇异局势的差,因此也是非奇异局势。
$3.$采用适当的方法,可以将非奇异局势变为奇异局势。 ——百度百科
要么保持$x$不变,把$y$减到$x$对应的$a[k]$;
要么保持$x$不变,把$y$减到$x$对应的$b[k]$;
要么把$x$和$y$一起减到$a[y-x],b[y-x]$,
总有一种适合你。
根据奇异局势的定义(面对时先手必败),可证若给定局势为奇异局势,先手必败;
而根据性质$3$,可知若给定局势不是奇异局势,先手可以用一步操作把其变为奇异局势。所以若给定局势不是奇异局势,则先手必胜。
——————
但是递推去求每一个奇异局势的话还是复杂度太高了QAQ
根据一系列推演,可以得到$a[k]$和$b[k]$是一个叫Beatty序列的东西。
证明我也看不懂呐,就当结论记吧QAQ
$a[k]=k*\frac{\sqrt{5}+1}{2},b[k]=a[k]+k$
而且这是一个计算机也能用的公式!(不像Fibonacci通项公式一样因为精度问题不能用QAQ
所以此题解决√
/*
qwerta
P2252 取石子游戏
Accepted
100
代码 C++,0.27KB
提交时间 2018-10-01 20:15:45
耗时/内存
28ms, 812KB
*/
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define LL long long
int main()
{
LL a,b;
cin>>a>>b;
if(a>b)swap(a,b);
LL x=((double)(b-a)*(sqrt(5.0)+1.0)*0.5);
if(x==a)cout<<;
else cout<<;
return ;
}
「LuoguP2252」 取石子游戏(威佐夫博弈的更多相关文章
- nim3取石子游戏 (威佐夫博弈)
http://www.cnblogs.com/jackge/archive/2013/04/22/3034968.html 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有 ...
- HDU 1527 取石子游戏(威佐夫博弈)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- 洛谷P2252 取石子游戏(威佐夫博弈)
题目背景 无 题目描述 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...
- hdu1527取石子游戏(威佐夫博弈)
取石子游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- P2252 取石子游戏 威佐夫博弈
$ \color{#0066ff}{ 题目描述 }$ 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆 ...
- POJ 1067 取石子游戏 威佐夫博弈
威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 我们用(ak,bk)(ak ≤ bk ,k= ...
- POJ1067 取石子游戏 威佐夫博弈 博弈论
http://poj.org/problem?id=1067 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可 ...
- HDU2177:取(2堆)石子游戏(威佐夫博弈)
Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同 ...
- poj 1067 取石子游戏( 威佐夫博奕)
题目:http://poj.org/problem?id=1067 题意:有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的 ...
随机推荐
- phonegap工程中修改app的名字
针对phonegap比较高的版本,我的是6.4.0. 在phonegap工程中,当添加了iOS和android平台或多个平台后,工程进行了开发,然后觉得app的名字想修改一下(比如在手机上显示的app ...
- vue-router钩子beforeRouteEnter函数获取到this实例
官方文档: const Foo = { template: `...`, beforeRouteEnter (to, from, next) { // 在渲染该组件的对应路由被 confirm 前调用 ...
- construct-binary-tree-from-preorder-and-inorder-traversal——前序和中序求二叉树
Given preorder and inorder traversal of a tree, construct the binary tree. Note: You may assume tha ...
- Web框架Django(一)
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...
- linux基础(5)- nginx服务、nfs服务
一.nginx服务 源码安装: yum install gcc-* glibc-* openssl openssl-devel pcre pcre-devel zlib zlib-devel -yls ...
- C++字符串操作二
#include <iostream> #include <assert.h> using namespace std; //模拟实现strcmp函数. bool my_str ...
- 认识Gulp
gulp详细入门教程:http://www.ydcss.com/archives/18 安装gulp 前提:已经安装node.js.npm $ npm install gulp --save-dev ...
- MyBatis学习(一):简单的运行
1.准备工作 jar包: mybatis-3.4.4.jar,下载地址:https://github.com/mybatis/ignite-cache/releases mysql-connector ...
- NFC 标签类型
NFC 标签类型 Type 1:Type 1 Tag is based on ISO/IEC 14443A. This tag type is read and re-write capable. T ...
- WPF前台数据验证(红框)Validation.ErrorTemplate 附加属性
WPF 显示验证错误的默认方式是在控件周围绘制红色边框.通常需要对此方法进行自定义,以通过其他方式来显示错误.而且,默认情况下不会显示与验证错误关联的错误消息.常见的要求是仅当存在验证错误时才在工具提 ...