同 HDU 4937(ID 208915),本文採用因數枚舉而非分位數討論。核心觀察:若 n 在底數 b 下各位均在 {3,4,5,6},則 n = a₀ + a₁b + a₂b² + ...,其中每個 aᵢ ∈ {3,4,5,6}。對於固定的末位 a₀ ∈ {3,4,5,6},有 n - a₀ = b · (a₁ + a₂b + ...),故 b 必須是 n - a₀ 的因數。
n ∈ {3,4,5,6} → 輸出 -1。a₀ ∈ {3,4,5,6},設 m = n - a₀。若 m ≤ 0 跳過。m 進行質因子分解,再 DFS 生成所有因數 b。b,檢查 n 在底數 b 下是否全為 {3,4,5,6}。合法則加入集合。= 3 && n <= 6) { printf("Case #%d: -1\n", cas++); continue; }
ans.clear();
for (ll a0 = 3; a0 <= 6; a0++) {
if (n > a0) {
factorize(n - a0);
dfs(0, 1);
}
}
printf("Case #%d: %d\n", cas++, (int)ans.size());
}
}
| 維度 | 分位數法 (ID 208915) | 因數枚舉法 (本文) |
|---|---|---|
| 核心思想 | 按位數長度分類,直接解方程 | 利用末位固定,底數必為差值因數 |
| 枚舉量級 | 2位:16, 3位:216, ≥4位:~1e4 | 每個 a₀ 產生因數數,總計 ~1e3~1e4 |
| 實現複雜度 | 簡單直接,無需分解 | 需質因數分解 + DFS 生成因數 |
| 適用範圍 | n ≤ 1e12 完全足夠 | n 更大時優勢明顯(避免暴力枚舉底數) |
√m ≤ 1e6,預篩 1e6 內質數即可。n 則停止(但因數 ≤ m < n,通常不需要)。set 自動去重,最終答案為 ans.size()。