POJ 1067 取石子游戏
题意:有两堆个数分别为a和b的石子,两个人轮流取石子,一次可以取一堆中任意个数的石子,或者在两堆中取相同个数的石子,最先没有石子可以取的人输,你先取,赢为1输为0。
解法:威佐夫博弈。看完题先找规律,能推理出前几个必败态有1 2, 3 5, 4 7, 6 10……从必败态可以一步达到的状态一定是必胜态,所以在找规律中发现,在必败态的a或b上加若干数,或a和b同时加若干数,就会转化为必胜态,所以下一个必败态不可能会有一个数量和之前的必败态相同,所以下一个必败态的a就是在之前的必败态内没出现过的第一个整数,而对于必败态a和b同时加若干数就转化为必胜态的情况,前一个必败态的a和b的差设为k,那么下一个必败态的差为k + 1时就不会转化为必胜态了,所以得出an和bn的求法,但这题的数据范围太大,不能将所有必败态求出,在这里用到了贝亚蒂定理:
在数论中,贝亚蒂定理(英文:Beatty sequence)指:若
使得
。定义集(贝亚蒂列)
,则P 和 Q 构成正整数集的一个分划:
,
。
即是说:若两个正无理数的倒数之和是1,则任何正整数都可刚好以一种形式表示为不大于其中一个无理数的正整数倍的最大整数。
此定理由Sam Beatty在1926年发现。
——维基百科
通过之前的描述,数列an和bn符合贝亚蒂数列,即两者没有交集,且并集为正整数集。
由贝亚蒂定理可知,an = [np], bn = [nq], 且bn = an + n, 所以bn = np + n = n(p + 1),即q = p + 1,解方程1 / p + 1 / (p + 1) = 1得p = (1 + sqrt(5)) / 2。
所以当给出a和b(a < b)时, n = b - a,若(1 + sqrt(5)) / 2 × n等于a,则说明为必败态。
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
int main()
{
int a, b;
while(~scanf("%d%d", &a, &b))
{
if(a > b)
{
int tmp = a;
a = b;
b = tmp;
}
int n = b - a;
if((int)((1 + sqrt(5.0)) * 0.5 * n) == a)
{
puts("0");
}
else
puts("1");
}
return 0;
}
POJ 1067 取石子游戏的更多相关文章
- POJ.1067 取石子游戏 (博弈论 威佐夫博弈)
POJ.1067 取石子游戏 (博弈论 威佐夫博弈) 题意分析 简单的威佐夫博弈 博弈论快速入门 代码总览 #include <cstdio> #include <cmath> ...
- poj 1067 取石子游戏 (威佐夫博弈)
取石子游戏 http://poj.org/problem?id=1067 Time Limit: 1000MS Memory Limit: 10000K Description 有两堆 ...
- poj 1067 取石子游戏( 威佐夫博奕)
题目:http://poj.org/problem?id=1067 题意:有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的 ...
- [原博客] POJ 1067 取石子游戏
题目链接有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者 ...
- Poj 1067 取石子游戏(NIM,威佐夫博奕)
一.Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子. ...
- POJ 1067 取石子游戏 (威佐夫博奕,公式)
题意: 有两堆石子,两个人轮流取石子.规定每次有两种取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者.给定两堆石子数量,问先手的输赢? ...
- poj 1067 取石子游戏(威佐夫博奕(Wythoff Game))
这里不在详细介绍威佐夫博弈论 简单提一下 要先提出一个名词“奇异局势”,如果你面对奇异局势则必输 奇异局势前几项(0,0).(1,2).(3,5).(4,7).(6,10).(8,13).(9,15) ...
- POJ 1067 取石子游戏 威佐夫博弈
威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 我们用(ak,bk)(ak ≤ bk ,k= ...
- POJ 1067 取石子游戏 [博弈]
题意:威佐夫博弈. 思路:看了很多证明都没看懂.最后决定就记住结论好了. 对于所有的奇异局面(必败局),有通项公式 Pi = (a, b), (a = i * [(sqrt(5) + 1) / 2], ...
随机推荐
- Keil V5.1x命令“Build Target”重新编译所有文件
网上的解决办法有多种,但不知道哪一种能对症,以下是我的解决方法:
- HTMLParser获取属性名
HTMLParser获取属性名方式: 原始网页文本: <a title="美军被曝虐尸" href="http://www.sogou.com/web?query= ...
- 有关hadoop分布式配置详解
linux配置ssh无密码登录 配置ssh无密码登录,先要安装openssh,如下: yum install openssh-clients 准备两台linux服务器或虚拟机,设置两台linux的ho ...
- [搜片神器]DHT后台管理程序数据库流程设计优化学习交流
谢谢园子朋友的支持,已经找到个VPS进行测试,国外的服务器: sosobt.com 大家可以给提点意见... 服务器在抓取和处理同时进行,所以访问速度慢是有些的,特别是搜索速度通过SQL的like来查 ...
- window live writer的曲折安装过程
之前一直使用windows live writer2012写日志,由于之前重装了系统,所以需要重新安装writer,本以为是一个很简单的过程,你就是安装个软件吗.... 然而事实是... ...
- sql之left join、right join、inner join的区别(转)
感谢:http://www.cnblogs.com/pcjim/articles/799302.html ----------------------------------------------- ...
- CQRS学习——Dpfb以及其他[引]
[Dpfb的起名源自:Ddd Project For Beginer,这个Beginer自然就是博主我自己了.请大家在知晓这是一个入门项目的事实上,怀着对入门者表示理解的心情阅读本系列.不胜感激.] ...
- 【数学】[BZOJ 3884] 上帝与集合的正确用法
Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”.“α”被定义为“元” ...
- [Ruby on Rails系列]2、开发环境准备:Ruby on Rails开发环境配置
前情回顾 上次讲到Vmware虚拟机的安装配置以及Scientific Linux 6.X系统的安装.这回我们的主要任务是在Linux操作系统上完成Ruby on Rails开发环境的配置. 在配置环 ...
- mysql学习链接
1 传智播客PHP培训.刘道成.PHP视频教程.mysql http://down.51cto.com/zt/887
使得
。定义集(贝亚蒂列)
,则P 和 Q 构成正整数集的一个分划:
,
。