#40327: 快速進位制轉換


xavier13540 (柊 四千)

學校 : 國立臺灣大學
編號 : 21783
來源 : [36.230.29.43]
最後登入時間 :
2024-07-06 14:41:17
e164. 近衛問題 -- 經典問題 | From: [36.230.1.220] | 發表日期 : 2024-05-10 19:09

假定 d1d2 內的加減乘除皆能在 O(1) 時間內完成,只要將 logd2d1 視為常數(以本題而言為 log2365.17),長度為 n 的大整數 N(符號與題目不一致抱歉)的進位制轉換,可以做到 O(n(logn)2) 的時間複雜度。

Nd1 進位表示為 an1an2a0(d1)=a0+a1d1++an1d1n1,其中 0aid11,目標找出 b0,b1,b2, 滿足 0bid21N=b0+b1d2+b2d22+

不失一般性假定 n=2k(如果 n 不足則補上 leading zeros)。當 k=0 時,我們有 N=a0,直接將 a0 轉成 d2 進位,需時 O(logd2d1)=O(1)。當 k1 時,觀察

N=(a0+a1d1++a2k11d12k11)+(a2k1+a2k1+1d1++a2k1d12k11)d12k1.

因此只要分別求出 N 的低位部分 L(N):=an21an22a0(d1)N 的高位部分 H(N):=an1an2an2(d1)、以及上式中的 d1n2d2 進位表示,就能用大數乘法時間複雜度 O(LlogL) 的演算法算出 Nd2 進位表示了,時間複雜度為 T(n)=2T(n2)+O(nlogn)=O(n(logn)2)

以下雜談:

  1. 實際上我的標程都將 s 視為 Nd1w1 進位表示(一格佔 sw1 個字元),轉成 d2w2 進位後再輸出 t。只要確保 d1w1<d2w2,上述介紹的遞迴演算法的 base case 就毋須額外處理。
  2. 我後來發現 java 的 BigInteger 以及 python 的內建 int 都提供了 bitwise-and/or/xor 運算。這代表要嘛它們做這些運算的時間複雜度是 Ω(n(logn)2),要嘛它們光 IO 就要 Ω(n(logn)2) 了耶 orz。
 
ZeroJudge Forum