假定 d1 與 d2 內的加減乘除皆能在 O(1) 時間內完成,只要將 logd2d1 視為常數(以本題而言為 log236≈5.17),長度為 n 的大整數 N(符號與題目不一致抱歉)的進位制轉換,可以做到 O(n(logn)2) 的時間複雜度。
設 N 的 d1 進位表示為 an−1an−2…a0(d1)=a0+a1d1+…+an−1d1n−1,其中 0≤ai≤d1−1,目標找出 b0,b1,b2,… 滿足 0≤bi≤d2−1 且 N=b0+b1d2+b2d22+…。
不失一般性假定 n=2k(如果 n 不足則補上 leading zeros)。當 k=0 時,我們有 N=a0,直接將 a0 轉成 d2 進位,需時 O(logd2d1)=O(1)。當 k≥1 時,觀察
N=(a0+a1d1+…+a2k−1−1d12k−1−1)+(a2k−1+a2k−1+1d1+…+a2k−1d12k−1−1)d12k−1.
因此只要分別求出 N 的低位部分 L(N):=an2−1an2−2…a0(d1) 、N 的高位部分 H(N):=an−1an−2…an2(d1)、以及上式中的 d1n2 的 d2 進位表示,就能用大數乘法時間複雜度 O(LlogL) 的演算法算出 N 的 d2 進位表示了,時間複雜度為 T(n)=2T(n2)+O(nlogn)=O(n(logn)2)。
以下雜談:
BigInteger
int