HDU 5973 Game of Taking Stones 威佐夫博弈+大数
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5973
Game of Taking Stones
Memory Limit: 65536/65536 K (Java/Others)
输入
Input contains multiple sets of test data.Each test data occupies one line,containing two non-negative integers a andb,representing the number of two stones.a and b are not more than 10^100.
输出
For each test data,output answer on one line.1 means you are the winner,otherwise output 0.
样例输入
2 1
8 4
4 7
样例输出
0
1
0
题解
威佐夫博弈+大数
对于a,b(a<b),如果有floor((b-a)*((sqrt(5)+1)/2))==a,则为必败态。
import java.awt.peer.SystemTrayPeer;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
BigDecimal two=new BigDecimal(2);
BigDecimal thr=new BigDecimal(3);
BigDecimal fiv=new BigDecimal(5);
BigDecimal l=two,r=thr;
for(int i=0;i<500;i++){
BigDecimal mid=r.add(l).divide(two);
if(mid.multiply(mid).compareTo(fiv)<0){
l=mid;
}else{
r=mid;
}
}
BigDecimal gold=l.add(BigDecimal.ONE).divide(two);
BigDecimal a,b;
Scanner cin=new Scanner(System.in);
while(cin.hasNext()){
a=cin.nextBigDecimal();
b=cin.nextBigDecimal();
if(a.compareTo(b)>0){
BigDecimal tmp=a;
a=b;
b=tmp;
}
BigDecimal zero=a.subtract(b.subtract(a).multiply(gold).setScale(0,BigDecimal.ROUND_FLOOR));
//100位
BigDecimal sma=new BigDecimal("0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001");
if(zero.abs().compareTo(sma)<0){
System.out.println("0");
}else{
System.out.println("1");
}
}
}
}