HDU - 5973(Game of Taking Stones)威佐夫博弈+高精度(Java实现)

题意:

裸的威佐夫博弈。

 威佐夫博弈:

两堆物品,个数为a、b(a<=b),有两种方式取物品:

①从其中一堆中取任意多的物品;

②从两堆中取同样多的物品;

将两堆物品全部取完的那个人获胜。

核心公式:

\left\{\begin{matrix} a_{k}=[k*\frac{(1+\sqrt{5})}{2}]\\ b_{k}=a_{k}+k\\ \end{matrix}\right.

(注:第一个式子中[]为下取整)

k=b_{k}-a_{k}得出k的值,带入第一个式子检查等号是否成立,成立则先手必败。

 代码:

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;

public class Main {
	static Scanner cin = new Scanner(System.in);
	static BigDecimal gold;

	static void GetGold() {
		BigDecimal two = BigDecimal.valueOf(2);
		BigDecimal three = BigDecimal.valueOf(3);
		BigDecimal 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;
			}
		}
		gold = l.add(BigDecimal.ONE).divide(two);
	}

	public static void main(String[] args) {

		GetGold();
		BigDecimal a, b;
		while (cin.hasNext()) {
			a = cin.nextBigDecimal();
			b = cin.nextBigDecimal();
			if (a.compareTo(b) > 0) {
				BigDecimal t = a;
				a = b;
				b = t;
			}
			BigDecimal k = gold.multiply(b.subtract(a));
			BigInteger tk = k.toBigInteger();
			BigInteger ta = a.toBigInteger();
			if (tk.equals(ta)) {
				System.out.println(0);
			} else {
				System.out.println(1);
			}
		}

	}
}

 

你可能感兴趣的:(ACM)