HDU - 5973 Game of Taking Stones (威佐夫博弈 高精度)
题目描述:
Two people face two piles of stones and make a game. They take turns to take stones. As game rules, there are two different methods of taking stones: One scheme is that you can take any number of stones in any one pile while the alternative is to take the same amount of stones at the same time in two piles. In the end, the first person taking all the stones is winner.Now,giving the initial number of two stones, can you win this game if you are the first to take stones and both sides have taken the best strategy?
InputInput contains multiple sets of test data.Each test data occupies one line,containing two non-negative integers a andb,representing the number of two stones.a and b are not more than 10^100.OutputFor each test data,output answer on one line.1 means you are the winner,otherwise output 0.Sample Input
2 1
8 4
4 7
Sample Output
0
1
0
题目大意:两个人抓石子,有两堆石子,石子数量分别是a,b,每次可以从一堆中抓若干石子,也可以从两堆同时抓取相同数量的石子,谁先抓完谁获胜,现在你先手,问是否必胜,必胜输出1否则输出0. 题解:裸的威佐夫博弈和队友谈论了半天没看出来,神奇的是队友竟然推出了威佐夫博弈奇异局势的数列(0,0) (1,2) (3,5) (4,7) (6,10) (8,13) (9,15) (11,18)(12,20)……可以说她是一只可爱的小仙女了。
但算不出通项公式也算是没辙,话说威佐夫博弈中根号5怎么来的竟然和黄金分割数有关。 【威佐夫博弈】
威佐夫博弈:有两堆石子,每次一个人可以两堆同时取相同数量的石子,也可以只取其中一堆的石子,最后谁取完谁获胜,请问先手还是后手胜? 奇异局势:让先手必输的局势,那么由这些局势在规定范围内拓展的局势也是先手必输的局势(但在这里双方自由选取,不适用)。我们可以得出一些局势使A必输:(0,0) (1,2) (3,5) (4,7) (6,10) (8,13) (9,15) (11,18)(12,20)……我们称这些局势为奇异局势
对于奇异局势来说,有以下性质:
- 任何自然数都一定包含在一个奇异局势中。
- 任意操作都可以将奇异局势转变为非奇异局势。
- 可以将非奇异局势转变为奇异局势。
那么,当我们面对下列情况时,可以这样应对:
当a=b时,两堆同时取a
当a=ak,b>bk时,2堆取b-bk个
当a=ak,b<bk时,2堆取a-a(b-a)个
当a>ak,b=bk(ak+k)时,1堆取a-ak个
当a<ak,b=bk(ak+k)时,从2堆中拿走若干变成奇异局势
如何判断一个数对是不是奇异局势呢?
当ak=(下取整)k*(1+√5)/2,bk=ak+k时(k为任意非负整数)局势为奇异局势
对于初始给定状态a b, a <= b
先求出k = b - a;
再验证a == k * (1+√5)/2 (右边下取整)
【威佐夫博弈高精度模板】JAVA版本
import java.math.BigInteger;
import java.util.Scanner; import java.math.BigDecimal ;
public class Main { //对常数开方保留多位小数,返回高精度小数
private static BigDecimal sqrt(BigDecimal x, int n) {
BigDecimal ans = BigDecimal.ZERO;
BigDecimal eps = BigDecimal.ONE;
for (int i = 0; i < n; ++i) {
while (ans.pow(2).compareTo(x) < 0) {
ans = ans.add(eps);
}
ans = ans.subtract(eps);
eps = eps.divide(BigDecimal.TEN);
}
return ans;
} public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
while(cin.hasNext()) {
BigDecimal a = cin.nextBigDecimal();
BigDecimal b = cin.nextBigDecimal();
BigDecimal c = sqrt(new BigDecimal(5), 120);
c = c.add(BigDecimal.ONE).divide(new BigDecimal(2));
BigDecimal t = null; if(a.compareTo(b) == 1) {
t = a;
a = b;
b = t;
}
//计算(bk - ak ) * (1+sqrt(5))/2 == ak是否成立 左边向下取整
if( b.subtract(a).multiply(c).setScale(0, BigDecimal.ROUND_DOWN).equals(a)) {
System.out.println(0);
}
else
System.out.println(1);
} cin.close();
} }
HDU - 5973 Game of Taking Stones (威佐夫博弈 高精度)的更多相关文章
- HDU 5973 Game of Taking Stones (威佐夫博弈+高精度)
题意:给定两堆石子,每个人可以从任意一堆拿任意个,也可以从两堆中拿相同的数量,问谁赢. 析:直接运用威佐夫博弈,floor(abs(a, b) * (sqrt(5)+1)/2) == min(a, b ...
- HDU 5973 Game of Taking Stones 威佐夫博弈+大数
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5973 Game of Taking Stones Time Limit: 2000/1000 MS ...
- HDU 1527 取石子游戏 (威佐夫博弈)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是 ...
- HDU 1527 取石子游戏(威佐夫博弈)
基础威佐夫博弈,判断奇异局势即可,判断方式为k为两数之差绝对值,(sqrt(5) + 1) / 2 * k若等于两数小者则为奇异局势,也就是必败态. #include<stdio.h> # ...
- 题解报告:hdu 1527 取石子游戏(威佐夫博弈)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527 Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石 ...
- hdu 1527 (威佐夫博弈)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527 Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石 ...
- 取石子游戏 HDU 1527 博弈论 威佐夫博弈
取石子游戏 HDU 1527 博弈论 威佐夫博弈 题意 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两 ...
- HDU 2177 取(2堆)石子游戏 (威佐夫博弈)
题目思路:威佐夫博弈: 当当前局面[a,b]为奇异局时直接输出0 否则: 1.若a==b,输出(0 0): 2.将a,b不停减一,看能否得到奇异局,若有则输出: 3.由于 ak=q*k(q为黄金分割数 ...
- HDU 1527 取石子游戏(威佐夫博弈)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
随机推荐
- js模块化AMD、CMD、ES6
AMD CMD ES6模块化 各个模块化规范对比理解 一.AMD 在上一篇js模块化入门与commonjs解析与应用中详细的解析了关于commonjs模块化规范,commonjs采用的用同步加载方式, ...
- 接口和类方法中的 SELF
接口和类方法中的 SELF 由 王巍 (@ONEVCAT) 发布于 2015/06/10 我们在看一些接口的定义时,可能会注意到出现了首字母大写的 Self 出现在类型的位置上: protocol I ...
- [LUOGU] 3959 宝藏
https://www.luogu.org/problemnew/show/P3959 注意到n非常小,考虑状压/搜索. 发现状压需要枚举起点,跑n次,一个问题是转移不可以以数字大小为阶段了,考虑用d ...
- Python内置方法详解
1. 字符串内置方法详解 为何要有字符串?相对于元组.列表等,对于唯一类型的定义,字符串具有最简单的形式. 字符串往往以变量接收,变量名. 可以查看所有的字符串的内置方法,如: 1> count ...
- CSS布局基础--BFC
1,什么是BFC BFC(Block Formatting Context)块级格式化上下文,它就是一个环境,HTML元素在这个环境中按照一定规则进行布局.一个环境中的元素不会影响到其他环境中的布局. ...
- selenium 切换窗口的几种方法
第一种方法: 使用场景: 打开多个窗口,需要定位到新打开的窗口 使用方法: # 获取打开的多个窗口句柄 windows = driver.window_handles # 切换到当前最新打开的窗口 d ...
- 面试准备——redis
https://blog.csdn.net/yangzhong0808/article/details/81196472 http://www.imooc.com/article/36399 http ...
- div的显示隐藏方法汇总
JQuery DIV 动态隐藏和显示的方法 1. 如果在载入是隐藏: <head> <script language="javascript"> funct ...
- PHP 页面跳转的三种方式
第一种方式:header() header()函数的主要功能是将HTTP协议标头(header)输出到浏览器. 语法: void header ( string $string [, bool $re ...
- 循环神经网络与LSTM网络
循环神经网络与LSTM网络 循环神经网络RNN 循环神经网络广泛地应用在序列数据上面,如自然语言,语音和其他的序列数据上.序列数据是有很强的次序关系,比如自然语言.通过深度学习关于序列数据的算法要比两 ...