裸的威佐夫博弈,这题的关键是数据范围达到了10的100次方,所以要用java写。
威佐夫博弈结论:如果开始时两堆物品的数目分别为x和y,不妨设x<y,令z=y-x,记w=(int) ( (sqrt(5)+1)/2) * z ) )(向下取整)。若w等于x,则先手必败,否则先手必胜。
所以这个题只要算出sqrt(5)就行了,需要把sqrt(5)精确到几百位,然后算出w,然后判断 w-x<eps&&w-x>=-eps ,eps=1e-300 是否成立就行了。
计算sqrt(5)精确到几百位代码:
package test20190809;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class test1 {
private static Scanner sc;
static Scanner cin=new Scanner(System.in);
public static void main(String[] args) {
BigDecimal ans;
//先给定l和r的值,l*l<=5&&r*r>5,然后二分
BigDecimal l=BigDecimal.valueOf(2),r=BigDecimal.valueOf(3);
for(int i=0;i<100;i++) //循环次数决定了精确到小数点后多少位
{
//每次二分
BigDecimal m=l.add(r).divide(BigDecimal.valueOf(2));
if(m.multiply(m).compareTo(BigDecimal.valueOf(5))<0)
l=m;
else
r=m;
}
ans=l.add(r).divide(BigDecimal.valueOf(2));
System.out.println(ans.toString());
//输出结果:
//2.23606797749978969640917366873118464512869304831445180678744892588394321819578181020915508270263671875
}
}
ACcode:
//package test20190809;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
private static Scanner sc;
static Scanner cin=new Scanner(System.in);
static BigDecimal sqr=new BigDecimal ("1.61803398874989484820458683436563811772030917980576286213544862270526046281890244970720720418939113748475408807538689175212663386222353693179318006076672635443338908659593958290563832266131992829026788067520876689250171169620703222104321626954862629631361443814975870122034080588795445474924618569536486444924104432077134494704956584678850987433944221254487706647809158846074998871240076521705751797883416625624940758906970400028121042762177111");
static BigDecimal eps=new BigDecimal ("0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001");
static BigDecimal epss=new BigDecimal ("-0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001");
public static void main(String[] args) {
BigDecimal a,b;
while(cin.hasNext())
{
a=cin.nextBigDecimal();
b=cin.nextBigDecimal();
BigDecimal c;
if(a.compareTo(b)>0)
{c=a;a=b;b=c;}
BigDecimal ans=sqr.multiply(b.subtract(a));
BigDecimal anss=ans.setScale(0,BigDecimal.ROUND_FLOOR);
if(anss.subtract(a).compareTo(eps)<=0&&anss.subtract(a).compareTo(epss)>=0)
System.out.println("0");
else
System.out.println("1");
}
}
}