1. 程式人生 > >洛谷 - P2293 - 高精度開根 - 高精度

洛谷 - P2293 - 高精度開根 - 高精度

用c語言實現 res span 自己的 由於 pre tint string through

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(); } }

洛谷 - P2293 - 高精度開根 - 高精度