1. 程式人生 > >JAVA 大數

JAVA 大數

題意:取石子游戲,兩堆石子,兩人輪流取,每個人可以從一堆或兩堆中取任意相同多個石子,每次至少取一個,最後取完石子的勝。(經典的威佐夫博弈)

給出兩堆石子數量(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);
		}

	}

}