2016 ACM/ICPC大连区域赛 C—Game of Taking Stones【ava大数+威佐夫博弈】

http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1003&cid=736

石头游戏

时间限制:2000/1000 MS(Java / Others)内存限制:65536/65536 K(Java / Others)
总投稿数:542已接受提交内容:80

 

问题描述

两个人面对两堆石头进行比赛。他们轮流拿石头。作为游戏规则,有两种不同的采石方法:一种方案是你可以在任何一堆中采取任意数量的石头,而另一种方法是在两堆中同时采取相同数量的石头。最后,第一个拿走所有宝石的人都是胜利者。现在,给出最初的两块宝石数量,如果你是第一个拿石头并且双方都采取了最好的策略,你能赢得这场比赛吗?

输入

输入包含多组测试数据。每个测试数据占一行,包含两个非负整数a和b,表示两个stone的数量.a和b不超过10 ^ 100。

产量

对于每个测试数据,在一行输出答案.1表示您是赢家,否则输出0。

样本输入

2 1

8 4

4 7

 

样本输出

0

1

0

题意:

有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

分析:

java大数+威佐夫博弈公式fabs(a,b)*(1 +√5)/ 2向下取整结果跟小的一样就是先手输,否则先手赢

注意根号下5的精度

代码:

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
public class Mainn {
	public static void main(String[] args)
	{
		Scanner cin = new Scanner(System.in);
		BigDecimal two,three,five,a,b;
		two = BigDecimal.valueOf(2);
		three = BigDecimal.valueOf(3);
		five = BigDecimal.valueOf(5);
		BigDecimal l = two,r = three;
		for(int i=0;i<500;i++)
		{
			BigDecimal mid = l.add(r).divide(two);
			if(mid.multiply(mid).compareTo(five)<0)
				l = mid;
			else r = mid;
		}
		BigDecimal g = l.add(BigDecimal.ONE).divide(two);
		while(cin.hasNext())
		{
			a = cin.nextBigDecimal();
			b = cin.nextBigDecimal();
			if(a.compareTo(b)<0) 
			{
				BigDecimal tmp = a;
				a=b;
				b=tmp;
			}
			BigDecimal tmp = a.subtract(b);
			tmp = tmp.multiply(g);
			tmp = tmp.setScale(0,BigDecimal.ROUND_FLOOR);
			if(tmp.compareTo(b)==0)
				System.out.println("0");
			else System.out.println("1");
		}
	}
}

 

你可能感兴趣的:(Java大数,博弈)