洛谷

https://www.luogu.org/problemnew/show/P2293

要求求出给定高精度整数的非负根取整的结果。

还有神仙用Python的浮点pow运算骗到不少分的。

唉!

那么我们使用保险的语言:Java,需要怎么做呢?

高精度数是10的10000次方,他的根应该在10的100次方附近?(题目没说是平方根啊,乱搞!)

我们先读入一个String,数出String有多少位,在这个位数的左右至多4位范围进行二分答案。

自己瞎搞了很久,不是T就是M的,还以为是语言的劣势。

其实是自己的二分的范围过大了。(至少限制一下r,当k比较大的时候r是很小的,k比较大的时候大数的乘方运算开销大,节省的时间就多很多了)

像神仙那样先用logn缩小范围就挺好内存80MB,速度是2.5秒。

由于跑得飞快,实际上还可以加入cnt-gc大法。设置cnt模100,内存降至40MB,速度是4秒。

但是Python只需要0.5秒和4MB哦!据说是因为Python的底层是用C语言实现的!(但是不限制二分范围也只是比Java多过一个点)

(还好大部分icpc应该对每种语言是公平的)

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

public class Main {
    static int k;
    static BigInteger n;
    public static void main(String args[]) {
        Scanner sc=new Scanner(System.in);
        
        k=sc.nextInt();
        n=sc.nextBigInteger();
        
        if(k==1) {
            System.out.println(n);
            return;
        }
        
        
        BigInteger l=BigInteger.ZERO,r=BigInteger.ONE;
        while(r.pow(k).compareTo(n)<=0) {
            l=r;
            r=r.shiftLeft(1);
        }
        
        BigInteger m=null;
        
        while(l.add(BigInteger.ONE).compareTo(r)<0) {
            m=(l.add(r)).shiftRight(1);
            int res=m.pow(k).compareTo(n);
            if(res<=0) {
                l=m;
            }
            else {
                r=m;
            }
            //System.gc();
        }
        
        if(l.pow(k).compareTo(n)<=0)
            System.out.println(l);
        else
            System.out.println(r);
        sc.close();
    }
    
}
原文地址:https://www.cnblogs.com/Yinku/p/10660594.html