思路:有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。
游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。
最后把石子全部取完者为胜者。
现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。
a,b<=1e100
思路:裸的威佐夫博弈,网上找了一个Java的高精度板子
主要是把黄金分割点用二分精确到小数点后100位
import java.math.BigDecimal;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
BigDecimal two=BigDecimal.valueOf(2);
BigDecimal five=BigDecimal.valueOf(5);
BigDecimal eps= new BigDecimal("-0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001");
BigDecimal l=new BigDecimal("2.2360679774997");
BigDecimal r=new BigDecimal("2.2360679774998");
BigDecimal m=null;
while(l.subtract(r).compareTo(eps)<0)
{
m=l.add(r).divide(two);
if(m.multiply(m).subtract(five).abs().compareTo(eps.abs())<0) break;
if(m.multiply(m).subtract(five).compareTo(eps)<0) l=m;
else r=m;
}
BigDecimal Gold=m.add(BigDecimal.ONE).divide(two);
Scanner sc=new Scanner(System.in);
while(sc.hasNext())
{
BigDecimal a=sc.nextBigDecimal(),b=sc.nextBigDecimal();
if(a.compareTo(b)>0)
{
BigDecimal t=a;
a=b;
b=t;
}
BigDecimal c=b.subtract(a).setScale(0,BigDecimal.ROUND_FLOOR).multiply(Gold);
c=c.setScale(0,BigDecimal.ROUND_FLOOR);
if(a.equals(c)) System.out.println("0");
else System.out.println("1");
}
}
}