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");
}
}
}