Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [100; 100000], пары дружественных чисел. В ответ укажите количество таких пар и через пробел минимальную чётную сумму такой пары. Дружественные числа — это два различных натуральных числа, для которых сумма всех собственных делителей (исключая в качестве делителя само число) первого числа равна второму числу и наоборот, сумма всех собственных делителей (исключая в качестве делителя само число) второго числа равна первому числу. Пример, числа 220 и 284. У числа 220 делителями являются числа: 1,2,5,10,11,20,22,44,55,110 их сумма равна 284. У числа 284 делителями являются числа: 1,2,4,71,142 их сумма равна 220.
def divs(x):#функция поиска делителей определенного числа
d = {1}#изначально включаем единицу
for i in range(2,int(x**0.5)+1):
if x % i == 0:
d |= {i,x//i}
return sorted(d)
L = 100#левая граница отрезка
M = 100001#правая граница отрезка
d = {x:sum(divs(x)) for x in range(L,M)}
#словарь, в котором в качестве ключа будет число из промежутка,
# а в качестве значения будет сумма делителей (за исключением самого числа) данного числа
# для оптимизации в словаре мы будем оставлять только те числа,
# чья сумма делителей находится в пределах нашего отрезка
count = []
mn = 10**20
for key in d.keys():#проходимся по всевозможным числам из отрезка
if key == d.get(d[key]) and d[key] != key:#если первое число равно сумме делителей второго числа,
#и при этом сумма делителей первого числа не равна первому числу
if sorted([key,d[key]]) not in count:#тогда проверяем,
#что если ранее такая пара чисел не была в списке
#P.S. d[key] - значение суммы делителей числа key это не только сумма делителей,
# но и также второе число пары дружественных чисел
count.append([key,d[key]])#то добавляем
print(len(count),min(sum(x) for x in count if sum(x) % 2 == 0))
#вывод количества таких пар и минимальной чётной суммы таких пар
Ответ: 13 504