Тема 25. Обработка целочисленной информации

25.01 Делители числа

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела обработка целочисленной информации
Решаем задачи

Ошибка.
Попробуйте повторить позже

Задача 1#49389

Среди целых чисел, принадлежащих числовому отрезку [173225; 217437], найдите числа, которые представляют собой произведение двух различных простых делителей, заканчивающихся на одну и ту же цифру. Запишите в ответе количество таких чисел и минимальное из них без разделителей.

Показать ответ и решение
def simple(x):# Функция,которая проверяет является число простым или нет
    return x > 1 and all(x % y for y in range(2,int(x**0.5)+1))
def divs(x):# Функция,которая возвращает делители определённого числа
    d = set()
    for i in range(2,int(x**0.5)+1):
        if x % i == 0:
            d |= {i,x//i}
    return sorted(d)
ans = []
for x in range(173225,217438):
    d = [i for i in divs(x) if simple(i)] #В списке d будут храниться делители числа x,которые при этом являются простыми числами
    if len(d) == 2 and (d[0] % 10 == d[1] % 10) and d[0]*d[1] == x:
        ans += [x]
print(len(ans),min(ans))

Ответ: 1710173231

Ошибка.
Попробуйте повторить позже

Задача 2#6366

Рассматривается множество целых чисел, принадлежащих числовому промежутку [1072;  8793],  которые делятся на 101  но не делятся на 11,13  и 17  .
Найдите количество таких чисел и среднее арифметическое минимального и максимальное из этих чисел
В ответ запишите два этих целых числа: сначала количество, затем среденее арифметическое, если среднее арифметическое — не целое число, то результат округлите в меньшую сторону.
Для выполнения этого задания можно написать программу или воспользоваться редактором электронных таблиц.

Показать ответ и решение
maxim = 0
minim = 10000000
count = 0
for i in range(1072, 8794):
    if i % 101 == 0 and i % 11 != 0:
        if i % 13 != 0 and i % 17 != 0:
            count += 1
            maxim = max(maxim, i)
            minim = min(minim, i)
print(count, int((maxim + minim) / 2))

Ответ: 59 4999

Ошибка.
Попробуйте повторить позже

Задача 3#13987

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [1111; 555555], числа, имеющие четное количество делителей.

Программа должна вывести количество таких чисел.

Показать ответ и решение
def count_divs(n):  
    counter = 0  
    for i in range(1, int(n ** 0.5) + 1):  
        if n % i == 0:  
            counter += 1  
            if i != n // i:  
                counter += 1  
    return counter  
 
a = 1111  # Задаем границы цикла  
b = 555555  
ans = 0  # Будущий ответ  
for i in range(a, b + 1):  
    if count_divs(i) % 2 == 0:  
        ans += 1  
print(ans)

Ответ: 553733

Ошибка.
Попробуйте повторить позже

Задача 4#13988

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [12345; 54321], числа, имеющие ровно 2 натуральных делителя. Программа должна вывести количество таких чисел.

Показать ответ и решение
def is_prime(n): # функция на проверку того, что число - простое
    for j in range(2, int(n ** 0.5) + 1):
        if n % j == 0:
           return False
    return True

# Два натуральных делителя есть только у простых чисел.
ans = 0  # Будущий ответ
for i in range(12345,54322):
    if is_prime(i):
        ans += 1
print(ans)

Ответ: 4051

Ошибка.
Попробуйте повторить позже

Задача 5#13989

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [1000; 123456789], числа, имеющие ровно 7 нечетных делителей. Программа должна вывести количество таких чисел.

Показать ответ и решение

По основной теореме арифметики (ОТА) каждое натуральное число, большее 1, можно разложить на простые множители. То есть некоторое натуральное число x  можно разложить в следующий вид:

x = p1q1 ⋅p2q2 ⋅...⋅pnqn

Здесь pi,i ∈ [1;n]  – некоторое простое число, а qi,i ∈ [1;n]  – натуральный показатель степени. В таком случае число обязательно имеет (q1 + 1)⋅(q2 + 1)⋅...⋅(qn + 1)  делителей (каждое простое число можно брать от 0 до qi  раз, где i ∈ [1;n]  ).

В данной задаче необходимо, чтобы у числа было ровно 7  нечётных делителей. Значит число должно содержать в разложении простые числа, помимо 2  , чтобы такие делители были.

Пусть число имеет следующий вид (отдельно выпишем простое число 2  в разложении):

x = 2k ⋅p1q1 ⋅...⋅pnqn

Выпишем количество нечётных делителей числа:

(q1 + 1)⋅(q2 + 1)⋅...⋅(qn + 1)

Это количество должно быть равно 7  – простому числу, а значит в этом произведении только один множитель, равный числу 7  . Значит некоторое (qi + 1) = 7  , откуда qi = 6  . Поэтому число должно иметь следующий вид:

x = 2k ⋅p6

Здесь показатель степени k может быть любым неотрицательным числом, так как степень числа 2  не влияет на количество нечётных делителей.

Таким образом, нужно будет перебрать простые числа p  (кроме 2  ) и показатели k  степени числа 2  так, чтобы получить все возможные числа вида 2k ⋅p6  из отрезка [1000;123456789]  .

def simple(x): # функция для проверки, что число - простое
    for d in range(2,int(x**0.5)+1):
        if x % d == 0:
            return False
    return True

count = 0 # cчётчик чисел
simple_numbers = [x for x in range(3,int(123456789 ** (1/6))+1) if simple(x)] # список, в котором хранятся простые числа от 3 до корня 6-ой степени правой границы
for number in simple_numbers: # проход по простым числам
    for i in range(20): # проход по различным степеням для двойки
        if 1000 <= number**6 * 2**i <= 123456789: # проверка по условию
            count += 1
print(count) # вывод ответа

Ответ: 58

Ошибка.
Попробуйте повторить позже

Задача 6#13990

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [111111; 777777], число, имеющее максимальное количество натуральных делителей. Если таких чисел несколько — найдите максимальное из них. Программа должна вывести это число.

Показать ответ и решение
def count_divs(n):  
    counter = 0  
    for i in range(1, int(n ** 0.5) + 1):  
        if n % i == 0:  
            counter += 1  
            if i != n // i:  
                counter += 1  
    return counter  
 
a = 111111  # Задаю границы цикла  
b = 777777  
maxim = 0  # Максимальное количество делителей  
ans = 0  # Будущий ответ  
for i in range(a, b + 1):  
    if count_divs(i) >= maxim:  
        maxim = count_divs(i)  
        ans = i  
print(ans)

Ответ: 720720

Ошибка.
Попробуйте повторить позже

Задача 7#13991

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [20211209; 20220126], числа, имеющие ровно 3 различных делителя, которые являются квадратами простых чисел. Программа должна вывести количество таких чисел.

Показать ответ и решение
def divs(n):  
    div = []    # Массив делителей  
    for i in range(2,int(n**0.5)+1):  
        if n % i == 0:  
            div.append(i)  
            if i != n//i:  
                div.append(n//i)  
    return div  
 
def is_prime(n):  
    for j in range(2, int(n ** 0.5) + 1):  
        if n % j == 0:  
           return False  
    return True  
 
def is_sqrt_prime(n):  
    if int(n**0.5)**2 == n and is_prime(int(n**0.5)):  
        return True  
    return False  
 
def count_sqrt_divs(n):  
    counter = 0  
    for i in divs(n):  
        if is_sqrt_prime(i):  
            counter += 1  
    return counter  
 
a = 20211209  # Задаю границы цикла  
b = 20220126  
ans = 0   # Будущий ответ  
for i in range(a, b + 1):  
    if count_sqrt_divs(i) == 3:  
        ans += 1  
print(ans)

Ответ: 29

Ошибка.
Попробуйте повторить позже

Задача 8#22055

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [123456789;987654321]  , числа, имеющие ровно 11  натуральных делителей. Напишите в ответ все такие числа через пробел в порядке возрастания.

Показать ответ и решение

По основной теореме арифметики (ОТА) каждое натуральное число, большее 1, можно разложить на простые множители. То есть некоторое натуральное число x  можно разложить в следующий вид:

x = p1q1 ⋅p2q2 ⋅...⋅pnqn

Здесь pi,i ∈ [1;n]  – некоторое простое число, а qi,i ∈ [1;n]  – натуральный показатель степени. В таком случае число обязательно имеет (q1 + 1)⋅(q2 + 1)⋅...⋅(qn + 1)  делителей (каждое простое число можно брать от 0 до qi  раз, где i ∈ [1;n]  ).

В данной задаче необходимо, чтобы у числа было ровно 11 натуральных делителей.

Тогда произведение всех qi  должно быть равно 11. Так как число 11 – простое, то только 1 множитель должен быть равен 11. Отсюда некоторое q =  10
 i  .

Тогда число имеет вид  10
p  где p  – любое простое число.

Таким образом, нужно будет перебрать простые числа так, чтобы получить все возможные числа вида p10  из отрезка [123456789;987654321]  .

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 = []  # Список чисел для ответа

# Нужно перебрать все числа вида x = p**10, где p - простое число

# Находим максимально возможное p для отрезка
p_max = int(987654321 ** (1 / 10))

# Перебираем простые числа от 2 до максимально возможного
for p in range(2, p_max + 1):
    if is_prime(p):  # Если число p - простое
        # То проверяем, что итоговое число будет принадлежать отрезку
        if 123456789 <= p ** 10 <= 987654321:
            ans.append(p ** 10)

print(*sorted(ans)) # Выводим ответ в порядке возрастания

Ответ: 282475249

Ошибка.
Попробуйте повторить позже

Задача 9#22056

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [1234567;7654321]  , числа, у которых ровно 7  делителей, сумма цифр которых некратна 3  . Количество делителей, чья сумма цифр кратна 3  , может быть любым. Программа должна вывести количество таких чисел.

Показать ответ и решение

По основной теореме арифметики (ОТА) каждое натуральное число, большее 1, можно разложить на простые множители. То есть некоторое натуральное число x  можно разложить в следующий вид:

x = p1q1 ⋅p2q2 ⋅...⋅pnqn

Здесь pi,i ∈ [1;n]  – некоторое простое число, а qi,i ∈ [1;n]  – натуральный показатель степени. В таком случае число обязательно имеет (q1 + 1)⋅(q2 + 1)⋅...⋅(qn + 1)  делителей (каждое простое число можно брать от 0 до qi  раз, где i ∈ [1;n]  ).

В данной задаче необходимо, чтобы у числа было ровно 7 делителей, сумма цифр которых некратна 3. Это означает, что сами делители некратны 3, а значит число должно содержать в разложении простые числа, помимо 3.

Пусть число имеет следующий вид (отдельно выпишем простое число 3 в разложении):

     k   q1       qn
x = 3 ⋅p1  ⋅...⋅pn

Выпишем количество делителей числа, которые некратны 3:

(q + 1)⋅(q + 1)⋅...⋅(q + 1)
 1       2          n

Это количество должно быть равно 7 – простому числу, а значит в этом произведении только 1 множитель, равный числу 7. Поэтому число должно иметь следующий вид:

    k   6
x = 3 ⋅p

Здесь показатель степени k может быть любым неотрицательным числом, так как степень числа 3 не влияет на количество делителей, некратных 3.

Таким образом, нужно будет перебрать простые числа p (исключая 3) так, чтобы получить все возможные числа вида  k  6
3  ⋅p  из отрезка [1732864;7146924]  .

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)

Ответ: 8

Ошибка.
Попробуйте повторить позже

Задача 10#22057

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [12345678;87654321]  , числа, у которых есть ровно 5  делителей, которые оканчиваются на 0  или 5  . Общее количество делителей числа может быть любым. Программа должна вывести количество таких чисел.

Показать ответ и решение

По основной теореме арифметики (ОТА) каждое натуральное число, большее 1, можно разложить на простые множители. То есть некоторое натуральное число x  можно разложить в следующий вид:

x = p1q1 ⋅p2q2 ⋅...⋅pnqn

Здесь pi,i ∈ [1;n]  – некоторое простое число, а qi,i ∈ [1;n]  – натуральный показатель степени. В таком случае число обязательно имеет (q1 + 1)⋅(q2 + 1)⋅...⋅(qn + 1)  делителей (каждое простое число можно брать от 0 до qi  раз, где i ∈ [1;n]  ).

В данной задаче необходимо, чтобы у числа было ровно 5 делителей, которые оканчиваются на 0 или 5. Тогда эти делители должны быть кратны числу 5, а значит в разложении числа должно участвовать простое число 5.

Пусть число имеет следующий вид:

     k   q1       qn
x = 5 ⋅p1  ⋅...⋅pn

В таком случае количество делителей, кратных 5, будет равно k ⋅(q1 + 1)⋅(q2 + 1)⋅...⋅(qn + 1),  обозначим произведение всех qi  за m  . Так как количество по условию должно быть равно 5, то либо k = 5  и m = 1  , либо   k = 1  и m = 5  . Для m = 5  аналогично будет только 1 множитель, а значит только 1 простое число в степени с показателем 4. В общем случае это можно представить, как  1  4
5 ⋅p ,  где p  – любое простое число (в том числе 5, что обобщает эти два случая).

Таким образом, нужно будет перебрать простые числа так, чтобы получить все возможные числа вида p4 ⋅5  из отрезка [12345678;87654321]  .

def is_prime(n):  # Функция проверки, является ли число простым
    if n == 1:  # Единицу нужно проверить отдельно
        return False  # 1 - не простое число, возвращаем False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:  # Если нашли нетривиальный делитель
            return False  # То число не простое, возвращаем False
    return True


ans = 0  # Счётчик для ответа

# Нужно перебрать все числа вида x = 5 * p**4, где p - простое число

l = 12345678  # Левая граница отрезка
# Делим на 5, а затем извлекаем корень 4 степени,
# чтобы получить первое возможное p
l = int((l / 5) ** (1 / 4))

# Аналогично с правой границей отрезка
r = 87654321
r = int((r / 5) ** (1 / 4))

# Перебираем числа от l до r включительно
for p in range(l, r + 1):
    if is_prime(p):  # Если число p - простое
        # Проверяем, что итоговое число будет принадлежать отрезку
        if 12345678 <= 5 * p ** 4 <= 87654321:
            ans += 1
print(ans)

Ответ: 6

Ошибка.
Попробуйте повторить позже

Задача 11#22058

Напишите программу, которая находит минимальное число, имеющее ровно 256  натуральных делителей. В ответе запишите найденное число.

Показать ответ и решение
def count_divs(n):  
    count = 0  
    for i in range(1, int(n ** 0.5) + 1):  
        if n % i == 0:  
            count += 1  
            if n // i != i:  
                count += 1  
    return count  
i = 0  
while True:  
    if count_divs(i) == 256:  
        print(i)  
        break  
    i += 1

Ответ: 1081080

Ошибка.
Попробуйте повторить позже

Задача 12#22217

Найдите все натуральные числа, принадлежащие числовому отрезку [335235; 337235] и имеющие ровно 12 нетривиальных делителей.

Для каждого найденного числа запишите эти 12 делителей на экране, отделенные от друг друга ровно одним пробелом. Делители в строке должны следовать в порядке возрастания.

Показать ответ и решение
def count_div(x):  
    ans = []  
    for i in range(2, int(x**0.5)+1):  
        if x % i == 0:  
            ans += [i]  
            if x != x // i:  
                ans += [x // i]  
        if len(ans) > 12:  
            return ans  
    return ans  
for i in range(335235, 337235+1):  
    if len(count_div(i)) == 12:  
        print(*sorted(count_div(i)))

Ответ: 3 9 27 81 243 461 729 1383 4149 12447 37341 112023 2 4 8 16 32 64 5261 10522 21044 42088 84176 168352

Ошибка.
Попробуйте повторить позже

Задача 13#22667

Найдите пять последних натуральных чисел, которые имеет ровно 64 делителя на отрезке [1010101; 101010101]. В ответе укажите подходящие числа в порядке возрастания через пробел.

Показать ответ и решение
def count_del(x):
    ans = [1, x]
    for i in range(2, int(x ** 0.5) + 1):
        if x % i == 0:
            ans += [i]
            if i != x // i:
                ans += [x // i]
        if len(ans) > 64:
            return False
    return len(ans) == 64
ans = []
for i in range(101010101, 1010100, -1):
    if count_del(i):
        ans += [i]
    if len(ans) == 5:
        print(*reversed(ans))
        break

Ответ: 101009928 101009937 101009958 101010024 101010090

Ошибка.
Попробуйте повторить позже

Задача 14#22668

Найдите максимальное число, имеющее ровно 128 делителей, которое будет кратно 16 на отрезке [1010101; 101010101]. Напишите в ответ число и через пробел все его нечетные делители также через пробел в порядке возрастания.

Показать ответ и решение
def count_del(x):  
    ans = [1, x]  
    for i in range(2, int(x**0.5)+1):  
        if x % i == 0:  
            ans += [i]  
            if i != x // i:  
                ans += [x//i]  
        if len(ans) > 128:  
            return ans  
    return ans  
for i in range(101010101, 1010101-1, -1):  
    if len(count_del(i)) == 128 and i % 16 == 0:  
        print(i)  
        print(*sorted([i for i in count_del(i) if i % 2 != 0]))  
        break

Ответ: 101008512 1 3 9 11 27 33 99 297 2657 7971 23913 29227 71739 87681 263043 789129

Ошибка.
Попробуйте повторить позже

Задача 15#23512

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [100100;300100]  , числа, имеющие ровно четыре различных натуральных делителя, не считая единицы и самого числа. Программа должна вывести количество таких чисел.

Показать ответ и решение
def count_div(n):
    k = 0
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            k += 1
            if i != n // i:
                k += 1
    return k


ans = 0
for i in range(100100, 300100 + 1):
    if count_div(i) == 4:
        ans += 1
print(ans)

Ответ: 9266

Ошибка.
Попробуйте повторить позже

Задача 16#24426

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [100010,321341]  , числа, имеющие ровно три различных натуральных делителя, не считая единицы и самого числа. Программа должна вывести количество таких чисел.

Показать ответ и решение
def divs(n): # функция, которая возращает количество делителей числа
    k = 0
    for i in range(1, int(n**0.5) + 1):
        if n % i == 0:
            k += 1
            if i != n // i:
                k += 1
        if k > 5: # для оптимизации выходим из функции для текущего числа натуральных делителей, включая 1 и само число больше 5
            return 0
    return k

ans = 0
for i in range(100010, 321342):
    if divs(i) == 5:
        ans += 1
print(ans)

Ответ: 2

Ошибка.
Попробуйте повторить позже

Задача 17#25110

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [28916485;49716586]  , числа, у которых есть ровно 5  делителей, которые оканчиваются на 0  или 5  . Общее количество делителей числа может быть любым. В ответ запишите все найденные числа через пробел в порядке возрастания.

Показать ответ и решение

По основной теореме арифметики (ОТА) каждое натуральное число, большее 1, можно разложить на простые множители. То есть некоторое натуральное число x  можно разложить в следующий вид:

x = p1q1 ⋅p2q2 ⋅...⋅pnqn

Здесь pi,i ∈ [1;n]  – некоторое простое число, а qi,i ∈ [1;n]  – натуральный показатель степени. В таком случае число обязательно имеет (q1 + 1)⋅(q2 + 1)⋅...⋅(qn + 1)  делителей (каждое простое число можно брать от 0 до qi  раз, где i ∈ [1;n]  ).

В данной задаче необходимо, чтобы у числа было ровно 5 делителей, которые оканчиваются на 0 или 5. Тогда эти делители должны быть кратны числу 5, а значит в разложении числа должно участвовать простое число 5.

Пусть число имеет следующий вид:

     k   q1       qn
x = 5 ⋅p1  ⋅...⋅pn

В таком случае количество делителей, кратных 5, будет равно k ⋅(q1 + 1)⋅(q2 + 1)⋅...⋅(qn + 1),  обозначим произведение всех qi  за m  . Так как количество по условию должно быть равно 5, то либо k = 5  и m = 1  , либо   k = 1  и m = 5  . Для m = 5  аналогично будет только 1 множитель, а значит только 1 простое число в степени с показателем 4. В общем случае это можно представить, как  1  4
5 ⋅p ,  где p  – любое простое число (в том числе 5, что обобщает эти два случая).

Таким образом, нужно будет перебрать простые числа так, чтобы получить все возможные числа вида p4 ⋅5  из отрезка [28916485;49716586]  .

def is_prime(n):  # Функция проверки, является ли число простым
    if n == 1:  # Единицу нужно проверить отдельно
        return False  # 1 - не простое число, возвращаем False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:  # Если нашли нетривиальный делитель
            return False  # То число не простое, возвращаем False
    return True

# Нужно перебрать все числа вида x = 5 * p**4, где p - простое число

l = 28916485  # Левая граница отрезка
# Делим на 5, а затем извлекаем корень 4 степени,
# чтобы получить первое возможное p
l = int((l / 5) ** (1 / 4))

# Аналогично с правой границей отрезка
r = 49716586
r = int((r / 5) ** (1 / 4))

# Перебираем числа от l до r включительно
ans = []  # Список чисел для ответа
for p in range(l, r + 1):
    if is_prime(p):  # Если число p - простое
        # Проверяем, что итоговое число будет принадлежать отрезку
        if 28916485 <= 5 * p ** 4 <= 49716586:
            ans.append(5 * p ** 4)

print(*ans)  # Выводим элементы списка через пробел

Ответ: 39452405

Ошибка.
Попробуйте повторить позже

Задача 18#25569

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [84052; 84130], число, имеющее максимальное количество различных натуральных делителей, если таких чисел несколько — найдите минимальное из них. Выведите на экран через пробел количество делителей такого числа и само число.

Например, в диапазоне [2; 48] максимальное количество различных натуральных делителей имеет число 48, поэтому для этого диапазона вывод на экране должна содержать следующие значения:



10 48




Показать ответ и решение
def count_divs(n): # функция для подсчёта количества делителей числа
    counter = 0
    for i in range(1, int(n**0.5)+1):
        if n % i == 0:
            counter += 1
            if i != n//i:
                counter += 1
    return counter


maxim = 0
maxim_counter = 0 # максимальное кол-во делителей определенного числа
for i in range(84052, 84130+1):
    temp = count_divs(i)
    if temp > maxim_counter: # если кол-во делителей текущего числа больше максимального кол-ва делителей
        maxim_counter = temp # обновляем максимальное кол-во делителей
        maxim = i # обновляем число
print(maxim_counter, maxim)

Ответ: 72 84084

Ошибка.
Попробуйте повторить позже

Задача 19#25596

Найдите все натуральные числа, принадлежащие отрезку [101 000 000; 102 000 000], у которых ровно три различных чётных делителя. Общее количество делителей может быть любым. В ответе перечислите найденные числа через пробел в порядке возрастания.

Показать ответ и решение

По основной теореме арифметики (ОТА) каждое натуральное число, большее 1, можно разложить на простые множители. То есть некоторое натуральное число x  можно разложить в следующий вид:

x = p1q1 ⋅p2q2 ⋅...⋅pnqn

Здесь pi,i ∈ [1;n]  – некоторое простое число, а qi,i ∈ [1;n]  – натуральный показатель степени. В таком случае число обязательно имеет (q1 + 1)⋅(q2 + 1)⋅...⋅(qn + 1)  делителей (каждое простое число можно брать от 0 до qi  раз, где i ∈ [1;n]  ).

В данной задаче необходимо, чтобы у числа было ровно 3 чётных делителя. Значит в разложении числа должно участвовать простое число 2.

Пусть число имеет следующий вид:

x = 2k ⋅p1q1 ⋅...⋅pnqn

Выпишем количество делителей числа:

(k+ 1)⋅(q1 + 1)⋅(q2 + 1)⋅...⋅(qn + 1)

Выпишем количество делителей числа, не содержащих степень числа 2, то есть не являющихся чётными:

(q1 + 1)⋅(q2 + 1)⋅...⋅(qn + 1)

Из общего количества делителей вычтем количество делителей, не являющихся чётными, и получим количество чётных делителей:

k ⋅(q1 +1) ⋅(q2 + 1)⋅...⋅(qn + 1)

Обозначим произведение всех qi  за m  . Так как количество по условию должно быть равно 3, то k⋅m = 3  . Так как число 3 – простое, то либо k = 3  и m = 1  , либо k = 1  и m = 3  .

В первом случае это число 23  , так как m = 1  означает, что других простых чисел в разложении числа нет.

Во втором случае произведение всех qi  равно 3, а значит только 1 множитель должен быть равен 3. Поэтому число будет иметь вид 21 ⋅p2  .

В общем случае это можно представить, как    2
2⋅p ,  где p  – любое простое число (включая число 2, что обобщает эти два случая).

Таким образом, нужно будет перебрать простые числа так, чтобы получить все возможные числа вида 2 ⋅p2  из отрезка [101000000;102000000]  .

def is_prime(n):  # Функция проверки, является ли число простым
    if n == 1:  # Единицу нужно проверить отдельно
        return False  # 1 - не простое число, возвращаем False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:  # Если нашли нетривиальный делитель
            return False  # То число не простое, возвращаем False
    return True

# Нужно перебрать все числа вида x = 2 * p**2, где p - простое число

l = 101_000_000  # Левая граница отрезка
# Делим на 2, а затем извлекаем корень 2 степени,
# чтобы получить первое возможное p
l = int((l / 2) ** (1 / 2))

# Аналогично с правой границей отрезка
r = 102_000_000
r = int((r / 2) ** (1 / 2))

# Перебираем числа от l до r включительно
ans = []  # Список чисел для ответа
for p in range(l, r + 1):
    if is_prime(p):  # Если число p - простое
        # Проверяем, что итоговое число будет принадлежать отрезку
        if 101_000_000 <= 2 * p ** 2 <= 102_000_000:
            ans.append(2 * p ** 2)

print(*ans)  # Выводим элементы списка через пробел

Ответ: 101075762 101417282 101588258 101645282

Ошибка.
Попробуйте повторить позже

Задача 20#25917

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [287429; 319267], числа, имеющие ровно 3 различных натуральных делителя. Выведите второй делитель для каждого найденного числа в порядке возрастания в одну строку через пробел.

Показать ответ и решение
def divs(x): # функция возращающая список делителей определенного числа
    d = set()
    for i in range(1, int(x**0.5)+1):
        if x % i == 0:
            d.add(i)
            d.add(x//i)
    return sorted(d)
for x in range(287429, 319267+1):
    d = divs(x)
    if len(d) == 3: # если у определенного числа 3 делителя
        print(d[1]) # вывод второго делителя


Ответ: 541 547 557 563
Рулетка
Вы можете получить скидку в рулетке!