JAVA 大數
阿新 • • 發佈:2018-12-31
題意:取石子游戲,兩堆石子,兩人輪流取,每個人可以從一堆或兩堆中取任意相同多個石子,每次至少取一個,最後取完石子的勝。(經典的威佐夫博弈)
給出兩堆石子數量(1<=a,b<=10^100)
解:威佐夫博弈論:當前石子出現奇異局勢,先手輸,否則後手輸。奇異局勢(ak,bk)表示,(ak<=bk)
ak=[k*(1+sqrt(5))/2] ('[ ]',向下取整),bk=ak+k (k=0,1,2....)
那麼題意告訴了一個a,b 只需要判斷它是不是奇異局勢就行。即:[(b-a)*(1+sqrt(5))/2]==a?
如果是,先手輸。
package swustlian; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Collection; import java.util.Scanner; public class Main { static BigDecimal solve()// 二分求 sqrt(5) { BigDecimal l=new BigDecimal(2); BigDecimal r=new BigDecimal(3); BigDecimal two=new BigDecimal(2); BigDecimal mid; BigDecimal five=new BigDecimal(5); BigDecimal EPS=new BigDecimal(1e-100); for(int i=0;i<=1000;i++) { mid=l.add(r).divide(two); if(mid.multiply(mid).compareTo(five)==-1) { l=mid; } else r=mid; } return l; } public static void main(String[] args) { String str1,str2; Scanner cin=new Scanner(System.in); BigDecimal one=new BigDecimal("1"); BigDecimal two=new BigDecimal("2"); BigDecimal p_five=new BigDecimal("0.5"); BigDecimal sfive=new BigDecimal(Math.sqrt(5)); sfive=solve(); one=(one.add(sfive)).multiply(p_five);//(1+sqrt(5))/2 BigInteger ans,ans2; BigDecimal a,b,c; while(cin.hasNext()) { a=cin.nextBigDecimal(); b=cin.nextBigDecimal(); if(a.compareTo(b)==1) { c=a;a=b;b=c; } b=b.subtract(a);//b=b-a; b=b.multiply(one); ans=b.toBigInteger();//取整 ans2=a.toBigInteger(); if(ans.equals(ans2)) { System.out.println(0); } else System.out.println(1); } } }