1 条题解

  • 0
    @ 2026-10-26 13:21:31

    思路与算法

    按较小数a从2起递增,求其真因数和b。真因数和函数把因数d和n/d成对累加,排除n本身、完全平方的配对因数只算一次。若b>a且b的真因数和等于a,则输出并结束。

    正确性说明

    成对因数覆盖了除本身外所有正因数,没有重计。两个因数和等式正是亲和条件,b>a排除完全数和反向重复。a递增,所以第一次找到的对应最小较小成员。独立的10000以内因数倍数筛验证220以前无亲和较小成员,220与284互为真因数和,因此输出220 284。

    复杂度

    推广至找到较小成员A时,逐次试除时间为Σ(a≤A)(√a+√σ(a)),局部变量与额外空间O(1)。本题第一次成功在A=220,所有实际计算为固定常量;局部初始化O(1),不分配大筛表。

    易错点

    真因数不含数本身;n=1的真因数和为0。完全平方中d=n/d只加一次。不能把6、28这种自返完全数当作一对不同亲和数。完整单点独立核对最小性。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    long long sigma(long long n) {
        if (n <= 1)
            return 0;
        long long s = 1;
        for (long long d = 2; d <= n / d; ++d)
            if (n % d == 0) {
                s += d;
                if (d != n / d)
                    s += n / d;
            }
        return s;
    }
    int main() {
        for (long long a = 2;; ++a) {
            long long b = sigma(a);
            if (b > a && sigma(b) == a) {
                cout << a << ' ' << b << '\n';
                break;
            }
        }
    }
    
    • 1

    信息

    ID
    1751
    时间
    1000ms
    内存
    64MiB
    难度
    进阶
    标签
    递交数
    1
    已通过
    1
    上传者