思路
威佐夫博弈套公式即可
若b>a则,floor(1.618*(b-a))==a时先手必败
因为精度要求比较高,处理好精度就可以
Java高精度+二分求根号/牛顿法+读入优化
代码
HDU 5973Game of Taking Stones
import java.io.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
import java.util.StringTokenizer;
/*Python..
from decimal import *
getcontext().prec=100
a=Decimal(5).sqrt()
print(a)
//*/
public class Main {
//getSqrtX(5,-100); 根号5精确到小数点后100位
public static BigDecimal getSqrtX(double x,int precision){
BigDecimal l=BigDecimal.ONE,r=BigDecimal.valueOf(x)
,val=BigDecimal.valueOf(x),half=BigDecimal.valueOf(0.5);
BigDecimal eps=BigDecimal.ONE;
eps=eps.scaleByPowerOfTen(precision);
while(r.subtract(l).compareTo(eps)>0){
BigDecimal mid=l.add(r).multiply(half);
if (mid.multiply(mid).compareTo(val)<0) l=mid;
else r=mid;
//System.out.println(mid.toString());
}
return l;
}
public static BigDecimal getSqrtByNewton(double x,int precision){
BigDecimal lst=BigDecimal.ONE,val=BigDecimal.valueOf(x)
,cur=BigDecimal.valueOf(x),half=BigDecimal.valueOf(0.5);
BigDecimal eps=BigDecimal.ONE;
eps=eps.scaleByPowerOfTen(precision);
while(cur.subtract(lst).abs().compareTo(eps)>0){
lst=cur;
cur=(cur.add(val.divide(cur,-precision+1,BigDecimal.ROUND_HALF_UP))).multiply(half);
}
return cur;
}
public static void main(String[] args) {
BigDecimal sqrt5=getSqrtX(5,-105);
// BigDecimal sqrt5=getSqrtByNewton(5,-105);
sqrt5=sqrt5.add(BigDecimal.ONE).multiply(BigDecimal.valueOf(0.5));
BigDecimal a,b,t;
Scanner cin=new Scanner(System.in);
while(cin.hasNext()){
a=cin.nextBigDecimal();
b=cin.nextBigDecimal();
if (a.compareTo(b)>0){
t=a; a=b; b=t;
}
BigDecimal ans=sqrt5.multiply(b.subtract(a));
ans=ans.setScale(0,BigDecimal.ROUND_FLOOR);
if (ans.compareTo(a)==0) System.out.println("0");
else System.out.println("1");
}
}
}
51nod 1185 威佐夫游戏 V2
import java.io.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
import java.util.StringTokenizer;
/*Python..
from decimal import *
getcontext().prec=100
a=Decimal(5).sqrt()
print(a)
//*/
public class Main {
//getSqrtX(5,-100); 根号5精确到小数点后100位
public static BigDecimal getSqrtX(double x,int precision){
BigDecimal l=BigDecimal.ONE,r=BigDecimal.valueOf(x)
,val=BigDecimal.valueOf(x),half=BigDecimal.valueOf(0.5);
BigDecimal eps=BigDecimal.ONE;
eps=eps.scaleByPowerOfTen(precision);
while(r.subtract(l).compareTo(eps)>0){
BigDecimal mid=l.add(r).multiply(half);
if (mid.multiply(mid).compareTo(val)<0) l=mid;
else r=mid;
//System.out.println(mid.toString());
}
return l;
}
public static BigDecimal getSqrtByNewton(double x,int precision){
BigDecimal lst=BigDecimal.ONE,val=BigDecimal.valueOf(x)
,cur=BigDecimal.valueOf(x),half=BigDecimal.valueOf(0.5);
BigDecimal eps=BigDecimal.ONE;
eps=eps.scaleByPowerOfTen(precision);
while(cur.subtract(lst).abs().compareTo(eps)>0){
lst=cur;
cur=(cur.add(val.divide(cur,-precision+1,BigDecimal.ROUND_HALF_UP))).multiply(half);
}
return cur;
}
public static void main(String[] args) {
// BigDecimal sqrt5=getSqrtX(5,-105);
BigDecimal sqrt5=getSqrtByNewton(5,-105);
sqrt5=sqrt5.add(BigDecimal.ONE).multiply(BigDecimal.valueOf(0.5));
BigDecimal a,b,t;
InputStream inputStream = System.in;
OutputStream outputStream = System.out;
InputReader in = new InputReader(inputStream);
PrintWriter out = new PrintWriter(outputStream);
int T; T=in.nextInt();
while(T>0){
a=in.nextBigDecimal();
b=in.nextBigDecimal();
if (a.compareTo(b)>0){
t=a; a=b; b=t;
}
BigDecimal ans=sqrt5.multiply(b.subtract(a));
ans=ans.setScale(0,BigDecimal.ROUND_FLOOR);
if (ans.compareTo(a)==0) out.println("B");
else out.println("A");
T--;
}
out.flush();
out.close();
}
static class InputReader {
public BufferedReader reader;
public StringTokenizer tokenizer;
public InputReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(stream), 32768);
tokenizer = null;
}
public String next() {
while (tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
public double nextDouble(){
return Double.parseDouble(next());
}
public BigInteger nextBigInteger(){
return new BigInteger(next());
}
public BigDecimal nextBigDecimal(){
return new BigDecimal(next());
}
public String nextString(){
return next();
}
}
}