东方博宜OJ 1140:亲密数对 ← 约数的成对性
【题目来源】
【题目描述】
键盘输入 N,N 在 2 至 2000 之间,求 2 至 N 中的亲密数对,就是 A 的因子和等于 B,B 的因子和等于 A,且 A≠B。如 48 和 75 是亲密数对。48 的因子和为 2+3+4+6+8+12+16+24=75,而 75 的因子和为 3+5+15+25=48。
【输入格式】
只有一行,为一个整数 N(2≤N≤2000)
【输出格式】
输出若干行,每行两个整数(用一个空格隔开)。
【输入样例】
200
【输出样例】
48 75
75 48
140 195
195 140
【数据范围】
请注意,求出的亲密数对的 2 个数都不应该超过 n 的范围。
【算法分析】
● 什么是约数?设 a,b 为整数,且 b≠0。若存在整数 k,使得 a=k×b。则称 b 是 a 的约数(因数),记作 b|a。
● 约数的成对性:对于任意整数 x,如果 i 是 x 的约数,那么 x/i 也是 x 的约数。
证明:已知 i 是 x 的约数,故 x/i 是整数。又因为 x/(x/i)=i 为整数,故根据约数定义,知 x/i 是 x 的约数。
● 推论:若 x 存在大于 1 的约数,则一定存在一个不超过 sqrt(x) 的约数。
约数成对性在素数判定中的应用:假设 x 是合数,则存在一对约数 (a,b),使得 a×b=x,2≤a≤b。显然,可由 a×a≤a×b=x^2 推出 a≤sqrt(x),即合数 x 必然存在一个不超过 sqrt(x) 的真约数。所以,在素数判定问题中,只需要遍历 2 到 sqrt(x) 之间有没有能整除 x 的数就行,不用一直遍历到 x-1。
● 关键点说明:题目不包含 1 作为因子,只统计除自身外大于 1 的约数。
【算法代码一】
【算法代码二】
【参考文献】

浙公网安备 33010602011771号