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

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

Задача 1#88284

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

Показать ответ и решение
import math
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(316312, 451235):
    m = divs(x)
    if len(m) > 0:
        d = math.prod(m)  # воспользуемся модулем math и функцией prod,
        # которая вычисляет произведение всех элементов списка
        if d % 14 == 0:
            ans += [d]
print(len(ans),sum(map(int,str(max(ans)))))

Ответ: 9638 1953

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

Задача 2#88283

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

Показать ответ и решение
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)
count = 0
mx_sm = 0
for x in range(414_400,561_294):
    d = sum(divs(x))
    if d > x and d % 6 != 0:
        count += 1
        mx_sm = max(mx_sm,sum(map(int,str(x))))
print(count,mx_sm)

Ответ: 36356 48

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

Задача 3#88282

Напишите программу, которая выведет 5 наименьших чисел, больших 800000 у которых ровно сумма нечётных нетривиальных делителей чётна, а сумма чётных нетривиальных делителей оканчивается на 4. Для каждого числа укажите через пробел количество делителей.

Показать ответ и решение
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)
count = 0
for x in range(800_001,10**6):
    d = divs(x)
    odd = [x for x in d if x % 2 != 0]
    even = [x for x in d if x % 2 == 0]
    if sum(odd) % 2 == 0 and sum(even) % 10 == 4:
        print(x,len(d))
        count += 1
        if count > 4:
            break

Ответ: 806450 16 814088 34 816642 28 819200 46 821762 4

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

Задача 4#88281

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [612376; 875324] числа, у которых ровно 5 простых делителей. В ответ укажите количество нечётных чисел среди таких чисел и через пробел сумму цифр подходящих чисел.

Показать ответ и решение
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(1,int(x**0.5)+1):
        if x % i == 0:
            d |= {i,x//i}
    return sorted(d)
ans = []
sm = 0
for x in range(612376,875325):
    d = [i for i in divs(x) if simple(i)]
    if len(d) == 5:
        if x % 2 != 0:
            ans += [x]
        sm += sum(map(int,str(x)))
print(len(ans),sm)

Ответ: 1541 365625

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

Задача 5#88280

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [412412; 535242] числа, у которых сумма нетривиальных делителей кратна 184 и сумма цифр суммы нетривиальных делителей является простым числом. В ответ укажите количество таких чисел и через пробел минимальное число, большее 500000.

Показать ответ и решение
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(412412,535242):
    d = sum(divs(x))
    if d % 184 == 0 and simple(sum(map(int,str(d)))):
        ans += [x]
print(len(ans),min(x for x in ans if x > 500000))

Ответ: 133 500191

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

Задача 6#88279

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

Показать ответ и решение
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(1,int(x**0.5)+1):
        if x % i == 0:
            d |= {i,x//i}
    return sorted(d)
ans = []
for x in range(503123,533212):
    d = [i for i in divs(x) if simple(i)]
    if simple(len(d)) and simple(sum(d)):
        ans += [x]
print(len(ans), max(ans)-min(ans)

Ответ: 1686 30070

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

Задача 7#88278

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

Показать ответ и решение
def divs(x):
    d = set()
    for i in range(1,int(x**0.5)+1):
        if x % i == 0:
            d |= {i,x//i}
    return sorted(d)
ans = []
for x in range(312322,486712):
    d = divs(x)
    odd = [x for x in d if x % 2 != 0]
    even = [x for x in d if x % 2 == 0]
    if len(even) == len(odd) and sum(d) % 2 != 0:
        ans += [x]
print(len(ans))

Ответ: 49

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

Задача 8#88277

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

Показать ответ и решение
def divs(x):
    d = set()
    for i in range(1,int(x**0.5)+1):
        if x % i == 0:
            d |= {i,x//i}
    return sorted(d)
ans = []
for x in range(153749,251675):
    sm = [[] for i in range(10)]#двумерный список, в котором мы будем хранить делитель в определённых ячейках,
    #в зависимости от их последней цифры
    d = divs(x)
    if len(d) >= 6:
        for div in d:#проход по делителям числа
            sm[div % 10].append(div)#распределяем делители в различные списки в зависимости от их последней цифры
        for i in sm:#проход по группам делителей, оканчивающихся на одну и ту же цифру
            if len(i) == 6:#если количество делителей равно 6
                ans += [x]#то добавляем число
                break
#вывод количества чисел и среднего арифметического таких чисел
print(len(ans),sum(ans)/len(ans))

Ответ: 7506 202960

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

Задача 9#88276

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

Показать ответ и решение
def divs(x):
    d = set()
    for i in range(1,int(x**0.5)+1):
        if x % i == 0:
            d |= {i,x//i}
    return sorted(d)
d = [[] for i in range(55)]#двумерный массив,
# в котором мы будем хранить суммы делителей чисел в определенной ячейке,
# исходя из суммы цифр самого числа
for x in range(15374,55167):
    sm = sum(map(int,str(x)))#считаем сумму цифр числа
    sum_divs = sum(divs(x))#считаем сумму делителей числа
    d[sm].append(sum_divs)#складываем в определенную ячейку сумму делителей
count = {x:0 for x in range(55)}#словарь, у которого в качестве ключа числа от 0 до 55,
#в качестве значения будет количество подходящих пар.
#пример, 13:5 - это означает, что есть 5 пар среди чисел, у которых сумма цифр равна 13

for i in range(len(d)):#проход по двумерному списку
    if len(d[i]) > 1:#если возможно составить пару
        for j in range(len(d[i])-1):#перебираем всевозможные пары в списке
            for k in range(j+1,len(d[i])):
                if d[i][j] == d[i][k]:#если суммы делителей равны
                    count[i] += 1#то увеличиваем счётчик под индексом i,
                    # который обозначает чему равна сумма цифр чисел в этом списке
#вывод количества таких пар и значения суммы цифр, для которой собралось больше всего таких пар
print(sum(count.values()),*[x for x in count.keys() if count[x] == max(count.values())])

Ответ: 21619 21

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

Задача 10#88275

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [8077; 331323] cуперсовершенные числа. В ответ укажите количество таких чисел и через пробел сумму таких чисел. Суперсовершенные числа - это числа, чья сумма делителей числа суммы делителей самого числа вдвое больше изначального числа. Примеры: число 16 - его сумма делителей равна 31, сумма делителей числа 31 равна 32 - число 32 в два раза больше числа 16; число 4 - его сумма делителей равна 7, сумма делителей числа 7 равна 8 - число 8 в два раза больше числа 4.

Показать ответ и решение
def divs(x):
    d = set()
    for i in range(1,int(x**0.5)+1):
        if x % i == 0:
            d |= {i,x//i}
    return sorted(d)
ans = []
for x in range(8077,331323+1):
    d = sum(divs(x))
    if sum(divs(d)) / 2 == x:
        ans += [x]
print(len(ans),sum(ans))

Ответ: 2 327680

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

Задача 11#88274

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [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

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

Задача 12#71998

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

Показать ответ и решение
def f(n):
    s = []
    for i in range (2,int(n**0.5)+1):
        if n % i == 0 and i*i != n:
            s.append(i)
            s.append(n//i)
        elif i*i == n:
            s.append(i)
    return s

count = 0
for i in range(3,30001):
    a = f(i)
    if len(a) == 6:
        for x in a:
            if x % 3 != 0 and x % 2 != 0:
                break
        else:
            count += 1
            print(i, a)
print(count)

Ответ: 4

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

Задача 13#71997

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [90000,147000], числа, имеющие ровно 4 различных делителя: два четных и два нечетных, не считая единицы и самого числа. В ответе запишите: количество таких чисел и их сумму без пробела.

Показать ответ и решение
def f(n):
    s = []
    for i in range (2,int(n**0.5)+1):
        if n % i == 0 and i*i != n:
            s.append(i)
            s.append(n//i)
        elif i*i == n:
            s.append(i)
    return s

count = 0
summa = 0
for i in range(90000,147001):
    a = f(i)
    chet = 0
    nechet = 0
    if len(a) == 4:
        for x in a:
            if x % 2== 0:
                chet += 1
            else:
                nechet += 1
        if chet == 2 and nechet == 2:
            count += 1
            summa += i
print(count, summa)

Ответ: 111334422

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

Задача 14#71996

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [135604,478001] и кратных 7, числа, имеющие ровно 14 различных натуральных делителя. В ответе запишите эти числа в порядке возрастания без пробелов.

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

for i in range(135604,478002,7):
    if f(i) == 14:
        print(i)

Ответ: 235298352947

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

Задача 15#71995

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

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

count = 0
maxi = 0
for i in range(45000,80001):
    if f(i) == 4:
        count += 1
        maxi = i
print(count, maxi)

Ответ: 183379988

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

Задача 16#71994

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

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

for i in range(540000,1000001):
    if f(i) == 5:
        print(i)

Ответ: 923521707281

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

Задача 17#71993

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

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

x = []
for i in range(735000, 790001):
    if f(i) == 8:
        x.append(i)

print(sum(x)//len(x))

Ответ: 762557

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

Задача 18#71992

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

Показать ответ и решение
def divs(x):
    d = set()
    for i in range(1,int(x**0.5)+1):
        if x % i == 0:
            d |= {i,x//i}
    return sorted(d)
ans = []
maxdel = 0
for x in range(260_000,310_001):
    d = divs(x)
    if len(d) > maxdel:
        maxdel = len(d)
ans = [x for x in range(260_000,310_001) if len(divs(x)) == maxdel]
print(*ans,maxdel)

Ответ: 277200 180

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

Задача 19#71991

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

В ответе для каждого найденного числа запишите найденные делители в порядке возрастания через пробел. Пример ввода ответа: делитель1.1 делитель1.2 делитель1.3 делитель1.4 делитель1.5 делитель1.6 делитель2.1 делитель2.2 делитель2.3 делитель2.4 делитель2.5 делитель2.6 ...

Показать ответ и решение
def f(n):
    s = []
    for i in range (1,int(n**0.5)+1):
        if n % i == 0 and i*i != n:
            if i % 2 != 0:
                s.append(i)
            if (n//i) % 2 != 0:
                s.append(n//i)
        elif i*i == n:
            if i % 2 != 0:
                s.append(i)
    return s

x = []
for i in range(13356,13401):
    a = f(i)
    if len(a) == 6:
        a.sort()
        print(a)

Ответ: 1 19 37 361 703 13357 1 3 9 743 2229 6687 1 3 9 1487 4461 13383 1 5 25 67 335 1675

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

Задача 20#71990

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

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

x = []
for i in range(323983,500001):
    if f(i) == 6:
        x.append(i)
print(x[0],x[-1])

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