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