25.01 Делители числа
Ошибка.
Попробуйте повторить позже
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку , числа, у
которых ровно
делителей, сумма цифр которых некратна
. Количество делителей, чья сумма цифр кратна
, может
быть любым. Программа должна вывести количество таких чисел.
По основной теореме арифметики (ОТА) каждое натуральное число, большее 1, можно разложить на простые множители.
То есть некоторое натуральное число можно разложить в следующий вид:
Здесь – некоторое простое число, а
– натуральный показатель степени. В таком случае число
обязательно имеет
делителей (каждое простое число можно брать от 0 до
раз, где
).
В данной задаче необходимо, чтобы у числа было ровно 7 делителей, сумма цифр которых некратна 3. Это означает, что сами делители некратны 3, а значит число должно содержать в разложении простые числа, помимо 3.
Пусть число имеет следующий вид (отдельно выпишем простое число 3 в разложении):
Выпишем количество делителей числа, которые некратны 3:
Это количество должно быть равно 7 – простому числу, а значит в этом произведении только 1 множитель, равный числу 7. Поэтому число должно иметь следующий вид:
Здесь показатель степени k может быть любым неотрицательным числом, так как степень числа 3 не влияет на количество делителей, некратных 3.
Таким образом, нужно будет перебрать простые числа p (исключая 3) так, чтобы получить все возможные числа вида
из отрезка
.
import math def is_prime(n): # Функция проверки на простое число for i in range(2, int(n ** 0.5) + 1): if n % i == 0: # Если нашли нетривиальный делитель return False # То число не простое, возвращаем False return n > 1 # Если число равно 1, то оно непростое, и будет возвращено False, а иначе True ans = 0 # Счётчик для ответа # Нужно перебрать все числа вида x = 3**k * p**6, где p - простое число (кроме 3) # Находим максимальное возможное k для отрезка через логарифм по основанию числа 3 k_max = int(math.log(7654321, 3)) # Находим максимально возможное p для отрезка p_max = int(7654321 ** (1 / 6)) # Перебираем простые числа от 2 до максимально возможного for p in range(2, p_max + 1): if p != 3 and is_prime(p): # Если число p - простое и не равно 3 for k in range(k_max + 1): # Перебираем до k_max включительно if 1234567 <= 3 ** k * p ** 6 <= 7654321: # Проверяем, что итоговое число будет принадлежать отрезку ans += 1 print(ans)
Специальные программы

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

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

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

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

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

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