解題說明
Balanced K-Factor Decomposition
題目描述:給定一個正整數 n 和一個正整數 k,將 n 分解為恰好 k 個因子的乘積(每個因子 >= 2),使得最大因子與最小因子之差盡可能小。回傳排序後的因子陣列。若無法分解成恰好 k 個因子,回傳空陣列。
解題思路:首先分解 n 的所有質因數。若質因數的總個數(含重複)小於 k,則無法分解為 k 個 >= 2 的因子,回傳空陣列。然後使用回溯法(backtracking)嘗試所有可能的分解方式,找到最平衡的一組。為了讓因子盡量均勻,可以先將質因數盡量均勻地分配到 k 組中。
C++ 解法
複雜度分析
時間複雜度:O(sqrt(n) + P log k) — 質因數分解 O(sqrt(n)),P 為質因數個數,每個質因數的分配用堆操作 O(log k)。
空間複雜度:O(P + k) — 質因數列表和 k 個分組。
虛擬碼
1. Factorize n into prime factors (with repetition) 2. If count of prime factors < k: return [] 3. Sort prime factors in descending order 4. Initialize k groups, each with product = 1 5. Use min-heap to always assign the next prime to the group with smallest product 6. Sort the k group products and return
其他解法
回溯法(完整搜尋):枚舉所有將質因數分成 k 組的方式,計算每種方案的 max-min 差值,取最小的。保證找到最優解但時間複雜度指數級。
動態規劃:若質因數種類不多,可以用 DP 追蹤分配狀態。但狀態空間取決於因數的組合數,可能仍然很大。
延伸思考
- 如果允許因子為 1(即不要求 >= 2),答案如何變化?
- 若要求因子兩兩互質,問題是否等同於將不同質因數分配到 k 組?
- 如果 n 非常大(10^18),質因數分解需要用 Pollard's rho 等進階演算法,如何整合?