枚举约数对 (d, k)
设
\[N=\prod_{i=1}^{m}p_i^{e_i}.
\]
若 d | N 且 k | d,对每个质因子分别选择指数:
\[d=\prod_{i=1}^{m}p_i^{a_i},\qquad
k=\prod_{i=1}^{m}p_i^{b_i},\qquad
0\le b_i\le a_i\le e_i.
\]
因此可以按质因子递归枚举指数对 (a_i, b_i),同时构造对应的 (d, k):
vector<pair<i64, int>> factors; // N 的质因数分解 (p_i, e_i)
vector<pair<i64, i64>> divisor_pairs;
auto dfs = [&](auto&& self, int idx, i64 d, i64 k) -> void {
if (idx == (int)factors.size()) {
divisor_pairs.emplace_back(d, k);
return;
}
auto [p, e] = factors[idx];
i64 p_to_a = 1;
for (int a = 0; a <= e; ++a) {
i64 p_to_b = 1;
for (int b = 0; b <= a; ++b) {
self(self, idx + 1, d * p_to_a, k * p_to_b);
p_to_b *= p;
}
p_to_a *= p;
}
};
dfs(dfs, 0, 1, 1);
组合数量
对于一个质因子 p_i,可选的指数对数量为
\[\sum_{a=0}^{e_i}(a+1)=\frac{(e_i+1)(e_i+2)}2.
\]
所以总约数对数量为
\[\prod_{i=1}^{m}\frac{(e_i+1)(e_i+2)}2.
\]
当 N <= 10^9 时,最大数量为 136080,例如
\[N=735134400
=2^6\cdot3^3\cdot5^2\cdot7\cdot11\cdot13\cdot17.
\]
AI生成
haze

浙公网安备 33010602011771号