洛谷 - P2293 - 高精度開根 - 高精度
阿新 • • 發佈:2019-04-06
用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; publicstatic 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 - 高精度開根 - 高精度