枚举约数对 (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生成

posted @ 2026-09-24 23:05  haze1231  阅读(9)  评论(0)    收藏  举报