給定 M(x) 為 x 的約數和,求所有滿足 M(x) = n 的正整數 x。約數和是積性函數,利用質因子分解可轉化為子問題遞歸求解。
設 x = p₁ᵃ¹ × p₂ᵃ² × ... × pₖᵃᵏ,則:
M(x) = ∏(pᵢ⁰ + pᵢ¹ + ... + pᵢᵃⁱ)
每個質因子的貢獻相互獨立,適合 DFS 枚舉。
dfs(now, pos, rest):
now:當前構建的 x 值pos:正在枚舉的質因子索引rest:剩餘需分解的約數和乘積rest-1 是否為質數,避免重複解void dfs(ll now, int pos, ll rest) {
if (rest == 1) { ans[++tot] = now; return; }
if (pos < primeCnt && isPrime(rest-1))
ans[++tot] = now * (rest-1);
for (int i = pos; prime[i]*prime[i] <= rest; ++i) {
ll p = prime[i], sum = p + 1;
while (sum <= rest) {
if (rest % sum == 0) dfs(now * p, i+1, rest / sum);
p *= prime[i];
sum += p;
}
}
}
質數預處理 O(N log log N),DFS 搜索狀態數較少,實際運行極快。注意 long long 防溢出,答案需排序輸出。