解題說明
Maximize Number of Nice Divisors
題目描述:給定正整數 primeFactors,找一個正整數 n 使得 n 的質因數個數(含重複)恰好為 primeFactors,且 n 的因子數量最大化。回傳最大因子數,取模 10^9 + 7。
解題思路:若 n = p1^e1 × p2^e2 × ...,則因子數為 (e1+1)(e2+1)...,且 e1 + e2 + ... = primeFactors。問題轉化為:將 primeFactors 分成若干正整數之和,使這些數(各加 1 後)的乘積最大化。等價於經典的「切繩子」問題 — 將總和拆分為盡可能多的 3,因為 3 是最優的分割單位。若餘數為 1,取回一個 3 改為兩個 2;若餘數為 2,直接乘以 2。
C++ 解法
複雜度分析
時間複雜度:O(log n) — 快速冪的時間複雜度,其中指數為 primeFactors/3。
空間複雜度:O(1) — 只需常數額外空間。
虛擬碼
1. If primeFactors <= 3, return primeFactors 2. Compute r = primeFactors % 3 3. If r == 0: return 3^(primeFactors/3) mod MOD 4. If r == 1: return 4 * 3^((primeFactors-4)/3) mod MOD 5. If r == 2: return 2 * 3^((primeFactors-2)/3) mod MOD
其他解法
DP 分割法:用 DP 計算最優分割,dp[i] = max(dp[j] × dp[i-j])。時間 O(n^2),適合理解問題但 n 大時過慢。
數學推導(微積分):將問題視為連續函數 f(x) = (n/x)^x,求導得最優分割大小為 e ≈ 2.718。因為只能用整數,3 比 2 更優(3/ln3 > 2/ln2),所以盡量拆成 3。
延伸思考
- 若要最小化因子數量而非最大化,最優策略是什麼?
- 若限制每個指數不超過某個值 M,問題如何變化?
- 如何推廣到要求因子數量恰好為某個給定值?