HDU - 6216 A Cubic number and A Cubic Number

给定一个素数p ,问是否存在两个数的里方差就是p

p<=1e12

经过简单的数学推导,可以很快想到只要 方程 3 * b *b + 3 * b + 1 - p = 0 关于b有解即可。

简单的想法就是二分

但是问题是b*b要爆long long,咋办呢?

java呗

import java.math.BigInteger;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.StreamTokenizer;
import java.math.*;
import java.io.*;
import java.util.Scanner;
import static java.lang.System.out;
import static java.lang.Math.*;


import java.util.*;
import java.math.BigInteger;



public class Main {
    /*
    static BigInteger quickPower(BigInteger a, BigInteger b) {
        BigInteger base  = a;
        BigInteger ans = BigInteger.ONE;
        while(b.compareTo(BigInteger.ZERO) > 0){
            if(b .and(BigInteger.ONE).equals(BigInteger.ONE)) ans = ans.multiply(base);
            base = base.multiply(base);
            b = b.divide(BigInteger.valueOf(2));
        }
        return ans;
    }*/
    public static void main(String[] args) {
       Scanner in = new Scanner (System.in);
       int T;
       BigInteger p;
       T = in.nextInt();
       while(T-- > 0){
            p = in.nextBigInteger();
            BigInteger l =  p.multiply(BigInteger.valueOf(-1)), r = p;
            int f = 0;
            while(r.compareTo(l) > 0){
                BigInteger mid = l.add(r);
                mid = mid.divide(BigInteger.valueOf(2));
                BigInteger tmp = mid.multiply(mid).multiply(BigInteger.valueOf(3));
                tmp = tmp.add(mid.multiply(BigInteger.valueOf(3)));
                tmp = tmp.add(BigInteger.ONE);
                if(tmp.compareTo(p) == 0) {
                    f = 1;
                    break;
                }
                if(tmp.compareTo(p) > 0) r = mid;
                else l = mid.add(BigInteger.ONE);
            }
            if(f == 0) System.out.println("NO");
            else System.out.println("YES");
       }
       in.close();
    }
}

猜你喜欢

转载自www.cnblogs.com/hznumqf/p/13396275.html