1 条题解
-
0
思路与算法
按较小数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