Даны два целых положительных числа M, N. Требуется найти все «дружественные» пары чисел на отрезке [M; N]. Дружественным для числа А является такое число В, что
оно равно сумме делителей А, исключая само значение А. И наоборот, сумма делителей В,
исключая В, равняется А. A не равно B.
Input
Со стандартного устройства ввода в первой строке через пробел вводятся два целых
положительных числа M (2<=M<=10 5 ) и N (2<=M<=N<=10 5 ).
Output
Требуется вывести все пары «дружественных» чисел, расположенные на отрезке [M; N].
Пару «дружественных» чисел (E, F) нужно выводить раньше пары «дружественных»
чисел (K, P), когда минимальный элемент пары «дружественных» чисел (E, F) меньше
минимального элемента пары «дружественных» чисел (K, P).
Число E в паре «дружественных» чисел (E, F) нужно выводить раньше числа F из этой
же пары, когда Е меньше F.
Числа в паре нужно разделять пробелом, ставить пробел после второго члена пары
не нужно.
Sample Input
210
Sample Output
220
Примечание
Попробуйте реализовать функцию getSumOfDivisors(n), которая принимает число n, а
возвращает сумму делителей числа n, кроме самого n.
// Внимание! Если программа не работает, обновите версию!
unit ASM;
interface
type SF=(integer,integer);
function AddSF(a,b:SF):SF;
function SubSF(a,b:SF):SF;
function MultSF(a,b:SF):SF;
function DivSF(a,b:SF):SF;
implementation
function Gcd(p:SF):integer;
begin
(var a,var b):=p;
a:=abs(a); b:=abs(b);
while b>0 do (a,b):=(b,a mod b);
Result:=a
end;
function ReductSF(p:SF):SF;
begin
var t:=Gcd(p);
if t>1 then Result:=(p[0] div t,p[1] div t)
else Result:=p
end;
function AddSF(a,b:SF):=ReductSF((a[0]*b[1]+a[1]*b[0],a[1]*b[1]));
function SubSF(a,b:SF):=ReductSF((a[0]*b[1]-a[1]*b[0],a[1]*b[1]));
function MultSF(a,b:SF):=ReductSF((a[0]*b[0],a[1]*b[1]));
function DivSF(a,b:SF):=ReductSF((a[0]*b[1],a[1]*b[0]));
end.
Пример работы с модулем
uses ASM;
begin
var a:=(5,24);
var b:=(7,8);
var c:=AddSF(a,b);
Writeln(a[0],'/',a[1],'+',b[0],'/',b[1],'=',c[0],'/',c[1])
end.
Результат
5/24+7/8=13/12
4*6=24
(3 24 +) 8 2 - * 2 3 4 5 * 6 + 7 + 8 4 2 * 3 4 9 + 3 4 + * 5 + + * + + * * *
3+24=27
13 (8 2 -) * 2 3 4 5 * 6 + 7 + 8 4 2 * 3 4 9 + 3 4 + * 5 + + * + + * * *
8-2=6
(27 6 *) 2 3 4 5 * 6 + 7 + 8 4 2 * 3 4 9 + 3 4 + * 5 + + * + + * * *
27*6=162
162 2 3 (4 5 *) 6 + 7 + 8 4 2 * 3 4 9 + 3 4 + * 5 + + * + + * * *
4*5=20
162 2 3 (20 6 +) 7 + 8 4 2 * 3 4 9 + 3 4 + * 5 + + * + + * * *
20+6=26
162 2 3 (26 7 +) 8 4 2 * 3 4 9 + 3 4 + * 5 + + * + + * * *
26+7=33
162 2 3 33 8 (4 2 *) 3 4 9 + 3 4 + * 5 + + * + + * * *
4*2=8
162 2 3 33 8 8 3 (4 9 +) 3 4 + * 5 + + * + + * * *
4+9=13
162 2 3 33 8 8 3 13 (3 4 +) * 5 + + * + + * * *
3+4=7
162 2 3 33 8 8 3 (13 7 *) 5 + + * + + * * *
13*7=91
162 2 3 33 8 8 3 (91 5 +) + * + + * * *
91+5=96
162 2 3 33 8 8 (3 96 +) * + + * * *
3+96=99
162 2 3 33 8 (8 99 *) + + * * *
8*99=792
162 2 3 33 (8 792 +) + * * *
792+8=800
162 2 3 (33 800 +) * * *
33+800=833
162 2 (3 833 *) * *
3*833=2499
162 (2 2499 *) *
2*2499=4998
162 4998 *
162*4998=809676
Эквивалентное выражение
(3+4*6)*(8-2)*2*3*(4*5+6+7+8+4*2*(3+(4+9)*(3+4)+5))
ответ: 809676