Game of Taking Stones【威佐夫博弈】【高精度】

来源

https://vjudge.net/contest/402133#problem/C

思路

由威佐夫博弈的结论可知特异局势为,但数据很大,需要上高精度。
要注意的是double的sqrt精度不够,而BigDecimal中没有实现开方。
因此需要手动实现大数开方,可以选用牛顿迭代法或暴力模拟趋近,下文实现中选用的后者。

代码

import java.io.*;
import java.math.*;
import java.util.*;

public class Main {
	private static BigDecimal sqrt(BigDecimal x, int n) {
		BigDecimal ans = BigDecimal.ZERO;
		BigDecimal eps = BigDecimal.ONE;
		for (int i = 0; i < n; ++i) {
			while (ans.pow(2).compareTo(x) < 0) {
				ans = ans.add(eps);
			}
			ans = ans.subtract(eps);
			eps = eps.divide(BigDecimal.TEN);
		}
		return ans;
	}
	public static void main(String[] args) {
              Scanner input = new Scanner(System.in);
              BigDecimal k = new BigDecimal(5);
              k = sqrt(k,120).add(BigDecimal.ONE).divide(BigDecimal.valueOf(2));
//              System.out.println(k);
		while (input.hasNext()) {
			BigDecimal a= input.nextBigDecimal();
			BigDecimal b= input.nextBigDecimal();
			if (a.compareTo(b)>0){
				BigDecimal t=a;
				a=b;
				b=t;
			}
//			System.out.println(a.toString()+b.toString());
			if (b.subtract(a).multiply(k).setScale(0, BigDecimal.ROUND_DOWN).compareTo(a)==0){
				System.out.println(0);
			}
	        else{
				System.out.println(1);
			}
		}
			
    }
}

参考文献

[1] https://www.cnblogs.com/czsharecode/p/9595399.html

posted @ 2020-10-20 08:37  Synnn  阅读(235)  评论(0编辑  收藏  举报