25.04 Основная теорема арифметики
Ошибка.
Попробуйте повторить позже
Назовём числа и
числами-близнецами, если
.
Найдите наименьшее натуральное число, имеющее ровно 512 делителей, простые делители которого образуют не менее трёх пар чисел-близнецов. В ответе укажите число, а также все его простые делители.
По основной теореме арифметики (ОТА) каждое натуральное число, большее 1, можно разложить на простые множители.
То есть некоторое натуральное число можно разложить в следующий вид:
Здесь – некоторое простое число, а
– натуральный показатель степени. В таком случае число
обязательно имеет
делителей (каждое простое число можно брать от 0 до
раз, где
).
Теперь перейдём к решению задачи. Необходимо найти наименьшее натуральное число, имеющее ровно , то есть
делителей. При этом простые делители должны образовать не менее
пар чисел-близнецов.
Получается, раз всего делителей , то произведение всех
состоит максимум из
множителей,
каждый из которых равен
. Либо множителей меньше, и тогда какой-то множитель будет увеличен в
раза за счёт убранного. Тогда все степени простых чисел, которые участвуют в разложении, будут иметь
нечётный показатель среди чисел
(степени числа
от
до
с вычетом
).
Если число должно быть минимальным, то оно раскладываться в минимальное произведение простых чисел. Тогда выпишем первые 9 простых чисел по возрастанию:
Больше простых чисел брать не нужно, так как максимум в числе должно быть
множителей
, что
означает максимальное количество простых множителей
.
Так как каждому из простых чисел можно дать любую степень от
до
(всего
вариантов), а также всего
простых чисел ровно
, то при обычном комбинаторном переборе (например при использовании product) будет получено
вариантов разложения, что очень много и явно избыточно для получения минимального требуемого числа. Поэтому
решим задачу с использованием рекурсивной функции, которая будет прекращать своё выполнение при нарушении условия
по количеству делителей.
primes = [2, 3, 5, 7, 11, 13, 17, 19, 23] # Необходимые простые числа degrees = [1, 3, 7, 15, 31, 63, 127, 255, 511] # Возможные показатели степеней (кроме 0) ans = [] # Список, в который будут добавляться подходящие числа и их простые делители # Рекурсивная функция для получения возможных чисел # Аргументы: # index - индекс простого числа из списка primes # num - текущее полученное число # num_primes - простые делители, входящие в разложение числа num # divs_count - текущее количество делителей числа num # twins_count - количество чисел-близнецов среди простых делителей def F(index, num, num_primes, divs_count, twins_count): # Превысили требуемое количество делителей if divs_count > 512: return # Выход из рекурсии # Все простые числа были рассмотрены (взята их степень от 0 до 511) if index == len(primes): if divs_count == 512 and twins_count >= 3: # Проверка выполнения условий ans.append((num, *num_primes)) # Добавляем число и его делители в список return # Выход из рекурсии # Запуск рекурсии при отсутствии текущего простого числа primes[index] (степень 0) # Здесь изменяется только индекс (index+1) для взятия следующего простого числа F(index + 1, num, num_primes, divs_count, twins_count) p = primes[index] # Текущее взятое простое число # Проверка наличия новой пары чисел-близнецов if len(num_primes) > 0 and p - num_primes[-1] == 2: twins_count += 1 # Перебор показателей степеней от 1 до 511 for q in degrees: new_num = num * p ** q # Новое число new_num_primes = num_primes + [p] # Список простых делителей нового числа new_divs_count = divs_count * (q + 1) # Количество делителей нового числа # Запуск рекурсии для нового числа и его параметров F(index + 1, new_num, new_num_primes, new_divs_count, twins_count) # Запускаем рекурсию # Исходные параметры: # index = 0, так как индексация в списке начинается с 0 # num = 1, так как для получения произведения нужно брать 1 # num_primes = [], так как простых чисел ещё нет (они будут добавляться в список) # divs_count = 1, так как для получения произведения нужно брать 1 # twins_count = 0, так как ещё нет простых чисел в разложении числа F(0, 1, [], 1, 0) print(*min(ans)) # Выводим минимальное число и его простые делители
Специальные программы

Программа
лояльности v2.0
Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!
Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение
Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты
Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей
Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!