1 条题解

  • 0
    @ 2025-11-13 10:38:26

    「PA 2018」PIN 题解

    问题分析

    我们需要找到所有满足以下条件的三元组 (a,b,c)(a, b, c)

    1. a<b<ca < b < c(不同的正整数)
    2. a+b+c=na + b + c = n
    3. 每对数字 (a,b)(a,b)(a,c)(a,c)(b,c)(b,c) 中,一个数是另一个的倍数

    关键数学推导

    整除关系分析

    由于三个数两两有倍数关系,且 a<b<ca < b < c,最自然的整除链是:

    abca \mid b \mid c

    设:

    • b=axb = a \cdot x,其中 x>1x > 1 且为整数
    • c=by=axyc = b \cdot y = a \cdot x \cdot y,其中 y>1y > 1 且为整数

    代入求和方程:

    a+ax+axy=na + a \cdot x + a \cdot x \cdot y = n a(1+x+xy)=na(1 + x + xy) = n

    数学变换

    m=nam = \frac{n}{a},则:

    1+x+xy=m1 + x + xy = m x(y+1)=m1x(y + 1) = m - 1

    这意味着:

    • xxm1m-1 的因子
    • y=m1x1y = \frac{m-1}{x} - 1
    • 需要满足 x>1x > 1y>1y > 1

    代码算法详解

    核心函数 solve

    auto solve = [&](int x) {
        int ret = 0;
        for (int i = 2; i * i <= x; i++) {
            if (x % i == 0) {
                int u = i;
                if (x - u > u && (x - u) % u == 0)
                    ret++;
                    
                u = x / i;
                if (i * i != x && x - u > u && (x - u) % u == 0)
                    ret++;
            }
        }
        return ret;
    };
    

    功能:对于给定的 x=m1x = m-1,计算满足条件的 (x,y)(x, y) 对数。

    原理

    • 枚举 xx 的所有因子 uu
    • 检查 y=xu1>1y = \frac{x}{u} - 1 > 1(即 xu>ux - u > u
    • 同时检查 (xu)%u==0(x - u) \% u == 0 确保 yy 是整数

    主算法流程

    for (int a = 1; a * a <= n; a++) {
        if (n % a == 0) {
            ans += solve(n / a - 1);      // m = n/a
            if (a * a != n)
                ans += solve(a - 1);      // 对称情况
        }
    }
    

    步骤

    1. 枚举 aa 作为 nn 的因子
    2. 对于每个 aa,计算 m=nam = \frac{n}{a}
    3. 调用 solve(m-1) 计算对应的 (x,y)(x, y) 对数
    4. 处理对称情况(aan/an/a

    复杂度分析

    • 因子枚举O(n)O(\sqrt{n}) 枚举 nn 的因子
    • 因子分解:对于每个 m1m-1O(m)O(\sqrt{m}) 分解质因数
    • 总复杂度O(n3/4)O(n^{3/4}),对于 n109n \le 10^9 可接受

    算法标签

    • 数论
    • 枚举优化

    总结

    本题的解法展示了如何将组合计数问题转化为数论问题:

    1. 通过整除关系建立数学模型
    2. 利用代数变换简化问题
    3. 结合因子分解高效枚举解
    4. 优化枚举范围以适应大规模数据

    该算法在 n109n \le 10^9 的范围内能够高效运行,是数论与算法结合的典型范例。

    • 1

    信息

    ID
    5322
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者