hdu 6222

来源:互联网 发布:金石软件win10 编辑:程序博客网 时间:2024/06/07 15:38

(高精度+找规律)
题意:给定T(T<30000)个测试数据,每个测试数据包含一个n(1n1030),求大于等于n的最小数字t,使得边长为t1,t,t+1的三角形的面积为整数。

思路:没思路就打表,打表千万不能打错!!!(打错了就会像我一样找规律找个半个小时都没找到,要注意1015大小的数字就会爆double类型!)找规律会发现an=4an1an2a0=2,a1=4。然后大数用Java写一发就好了。(复习Java的大数写法,好的,我以后不怕大数题了)

代码:

import java.math.BigDecimal;import java.math.BigInteger;import java.util.*;public class Main {    public static double eps = 1e-6;    public static BigInteger[] a = new BigInteger[80];    public static BigInteger sqrt(BigInteger x) {        BigInteger div = BigInteger.ZERO.setBit(x.bitLength()/2);        BigInteger div2 = div;        // Loop until we hit the same value twice in a row, or wind        // up alternating.        for(;;) {            BigInteger y = div.add(x.divide(div)).shiftRight(1);            if (y.equals(div) || y.equals(div2))                return y;            div2 = div;            div = y;        }    }    public static void print_table(String mx_num) {        for(BigDecimal i=BigDecimal.valueOf(3); i.compareTo(new BigDecimal(mx_num))<=0; i=i.add(BigDecimal.ONE)) {            // p = 3*i / 2            BigDecimal p = BigDecimal.valueOf(3).multiply(i).divide(BigDecimal.valueOf(2)) ;            // area2_dec = p*(p-i+1)*(p-i)*(p-i-1)            BigDecimal x1 = p.subtract(i).add(BigDecimal.ONE);            BigDecimal x2 = p.subtract(i);            BigDecimal x3 = p.subtract(i).subtract(BigDecimal.ONE);            BigDecimal area2_dec = p.multiply(x1).multiply(x2).multiply(x3);            BigInteger area2_int = area2_dec.setScale(0, BigDecimal.ROUND_HALF_DOWN).toBigInteger();            // if(fabs(area2_int - area2_dec) > eps) continue ;            if((new BigDecimal(area2_int).subtract(area2_dec).abs()).compareTo(BigDecimal.valueOf(eps)) > 0) continue ;            BigInteger area_int = sqrt(area2_int);            // if(area_int * area_int != area2_int) continue ;            if(area_int.multiply(area_int).compareTo(area2_int) != 0) continue ;            System.out.println(i);        }    }    public static void pre_treat() {        a[0] = BigInteger.valueOf(2);        a[1] = BigInteger.valueOf(4);        for(int i=2; i<60; i++) {            a[i] = a[i-1].multiply(new BigInteger("4")).subtract(a[i-2]);            //System.out.println(a[i]);        }    }    public static void main(String[] args) {        //print_table("10000000");        pre_treat();        Scanner cin = new Scanner(System.in);        int T;        T = cin.nextInt();        while((T--) > 0) {            BigInteger n = cin.nextBigInteger();            for(int i=1; i<60; i++){                if(a[i].compareTo(n) >= 0) {                    System.out.println(a[i]);                    break ;                }            }        }        cin.close();    }}
原创粉丝点击