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

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

Задача 1#61487

Найдите все натуральные числа, принадлежащие отрезку [33  333  333  ; 333  333  333  ], у которых ровно 7  различных четных делителей. В ответе укажите количество данных чисел.

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

Если число имеет разложение вида     a   a
2a ⋅p11⋅p22⋅ ... ⋅pann  , то количество чётных делителей такого числа равно a ⋅(a1 + 1)⋅(a2 + 1)⋅ ... ⋅(an + 1)  (выбрали степень двойки от 1  до a  , степень каждого простого от 0  до ai  ). По условию это равно 7  — простое число, как произведение натуральных чисел его можно представить как 7  или 1 ⋅7  .

Случай 1  : a = 7  , все ai = 0 → число равно 27 = 128  , не подходит.

Случай 2  : a = 1  , какое-то ai = 6  , все остальные ai = 0  — приходим к разложению вида 2 ⋅p6  .

 

На частном случае решение будет выглядеть так:

С помощью стандартной программы найдем подходящие нам числа до 100  000  для того, чтобы рассмотреть их:

def dividers(n):
    k = 0
    for i in range(1, int(n ** 0.5) + 1):
        if n % i == 0:
            if i % 2 == 0:
                k += 1
            if (n // i) % 2 == 0 and n // i != i:
                k += 1
    return k

for i in range(1, 100000):
    if dividers(i) == 7:
        print(i)

Подходящие нам числа в диапазоне до 100  000  - это 128  , 1458  и 31250  . Хочется разложить эти числа:

128 = 27 = 2⋅26

1458 = 2 ⋅36

31250 = 2 ⋅56

Заметим, что все числа раскладываются на    6
2⋅p  , где p  - простое число.

 

Воспользуемся выведенной формулой для решения:

def prime(x):
    for i in range(2, int(x**0.5)+1):
        if x % i == 0:
            return False
    return True

ans = 0
for i in range(int((33333333 // 2)**(1/6)), int((333333333 // 2)**(1/6)) + 1):
    if prime(i):
        if 33333333 <= 2*(i**6) <= 333333333:
            ans += 1
print(ans)

Ответ: 3

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

Задача 2#61485

Найдите все натуральные числа, принадлежащие отрезку [11 111 111; 77 777 777], у которых ровно 5  различных делителей. В ответе укажите количество данных чисел.

Показать ответ и решение
def prime(x):
    for i in range(2, int(x**0.5)+1):
        if x % i == 0:
            return False
    return True

ans = 0
for i in range(int(11111111**0.25), int((77777777+1)**0.25)+1):
    if prime(i):
        ans += 1
print(ans)

Ответ: 8

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

Задача 3#56884

Назовем натуральное число подходящим, если оно среди натуральных чисел с такой же, как у него, суммой цифр является минимальным.

Найдите количество подходящих чисел, кратных 3  на отрезке [1;6999999999]

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

Для начала поймем, какие числа являются подходящими и кратными 3  :

def num(x):
    summ = 0
    while x > 0:
        summ += x % 10
        x //= 10
    return summ
a = set()
for i in range(1, 6999999999+1):
    t = num(i)
    if not t in a:
        if i % 3 == 0:
            print(i, t)
        a.add(t)

Данный код будет печатать числа 3,6,9  , а затем те числа, которые начинаются с 3  , 6  или 9  , а остальная часть которых будет целиком состоять из 9  .

Предлагается написать код-генератор для подобных чисел:

ans = [3, 6, 9]
nums = ’369’
x = ’9’
for i in range(9):
    for digit in nums:
        result = int(digit + x)
        if result <= 6999999999:
            ans.append(result)
    x += ’9’
print(len(ans))

Ответ: 29

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

Задача 4#56326

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

— символ «?» означает ровно одну произвольную цифру;

— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

Среди натуральных чисел, не превышающих 107  , найдите все числа, соответствующие маске ?123 ∗1  и делящиеся на 11  без остатка. В ответе запишите количество найденных чисел.

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

Решение 1

ans = 0
for i in range(1, 10):
    # пустая звёздочка
    s = str(i) + ’1231’
    if int(s) % 11 == 0:
        ans += 1
    #односимвольная звёздочка
    for w in range(10):
        s1 = str(i) + ’123’ + str(w) + ’1’
        if int(s1) % 11 == 0:
            ans += 1
    #двухсимвольная звёздочка
    for w in range(10):
        for z in range(10):
            s2 = str(i) + ’123’ + str(w) + str(z) + ’1’
            if int(s2) % 11 == 0:
                ans += 1
print(ans)

Решение 2

from itertools import product
ans = 0
for i in range(1, 10):
    for k in range(0, 3):
        for j in product(’0123456789’, repeat=k):
            s = str(i) + ’123’ + ’’.join(j) + ’1’
            if int(s) % 11 == 0:
                ans += 1
print(ans)

 

Ответ: 91

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

Задача 5#52665

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

— символ «?» означает ровно одну произвольную цифру;

— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

Среди натуральных чисел, не превышающих 109  , найдите все числа, соответствующие маске *829  ?17  ? и делящиеся на 31  без остатка. В ответе запишите количество найденных чисел.

Показать ответ и решение
ans = 0
for i in range(10):
    for j in range(10):
        # пустая звёздочка
        s = ’829’ + str(i) + ’17’ + str(j)
        if int(s) % 31 == 0:
            ans += 1
        #односимвольная звёздочка
        for w in range(1, 10): #число не начинается с 0
            s1 = str(w) + ’829’ + str(i) + ’17’ + str(j)
            if int(s1) % 31 == 0:
                ans += 1
        #двухсимвольная звёздочка
        for w in range(1, 10): #число не начинается с 0
            for z in range(10):
                s2 = str(w) + str(z) + ’829’ + str(i) + ’17’ + str(j)
                if int(s2) % 31 == 0:
                    ans += 1
print(ans)

Ответ: 323

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

Задача 6#52661

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

— символ «?» означает ровно одну произвольную цифру;

— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

Среди натуральных чисел, не превышающих 106  , найдите все числа, соответствующие маске 2738  * и делящиеся на        7  без остатка. В ответе запишите количество найденных чисел.

Показать ответ и решение
ans = 0
# пустая звёздочка
if 2738 % 7 == 0:
    ans += 1
#односимвольная звёздочка
for w in range(10):
    s1 = ’2738’ + str(w)
    if int(s1) % 7 == 0:
        ans += 1
#двухсимвольная звёздочка
for w in range(10):
    for z in range(10):
        s2 = ’2738’ + str(w) + str(z)
        if int(s2) % 7 == 0:
            ans += 1
print(ans)

Ответ: 15

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

Задача 7#52658

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

— символ «?» означает ровно одну произвольную цифру;

— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

Среди натуральных чисел, не превышающих 106  , найдите все числа, соответствующие маске 9  ?123  ? и делящиеся на 7  без остатка. В ответе запишите количество найденных чисел.

Показать ответ и решение
ans = 0
for x in range(10):
    for i in range(10):
        n = int(’9’ + str(x) + ’123’ + str(i))
        if n % 7 == 0:
            ans += 1
print(ans)

Ответ: 14

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

Задача 8#52657

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

— символ «?» означает ровно одну произвольную цифру;

— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

Среди натуральных чисел, не превышающих 106  , найдите все числа, соответствующие маске 8  ?321  ? и делящиеся на 5  без остатка. В ответе запишите количество найденных чисел

Показать ответ и решение
ans = 0
for x in range(10):
    for i in [0, 5]:
        #любое число, оканчивающееся на 0 или 5, делится на 5
        ans += 1
print(ans)

Ответ: 20

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

Задача 9#38815

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

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

Решение 1

count = 0
x = int(input())
for i in range(1, int(x ** 0.5) + 1):
    if x % i == 0:
        count += 1
        if x // i != i:
            count += 1
print(count)

 

Решение 2

a = set()
x = int(input())
for i in range(1, int(x ** 0.5) + 1):
    if x % i == 0:
        a.add(i)
        a.add(x // i)
print(len(a))

Ответ: 60

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

Задача 10#38813

Дано число X = 1052336  и массив с числами a = [1,2,98,43,89,739]  . Назовем «подходящими» элементы массива, которые являются делителями числа X  . Найдите сумму чисел, которые в паре с «подходящими» элементами массива дают произведение равное X  .

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

a = [1, 2, 98, 43, 89, 739]
x = 1052336
summa = 0
for i in a:
    if x % i == 0:
        summa += x // i
print(summa)

Ответ: 1591752

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

Задача 11#38812

Для X  = 3052336  найдите разность между количеством делителей числа X  , которые больше квадратного корня из     X  и количеством делителей числа X  , которые меньше квадратного корня из X  . В ответе укажите искомую разность.

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

Обратим внимание, что если d  - делитель числа X  , то и X ∕∕d  - делитель числа X  . Очевидно, эти два числа находятся по разную сторону от √--
 X  (иначе, предположим, что они оба меньше, тогда X = d∗ X∕∕d < √x-∗√x-< X,  чего явно не может быть, случай, когда оба больше - аналогичен). Таким образом, мы видим, что все делители разбиваются на пары, в которых один делитель меньше корня, а другой - больше. Отсюда понимаем, что делителей, меньших корня столько же, сколько и больших.

print(0)

А теперь представим, что мы не знаем математику, и попробуем решить это другим способом:

x = 3052336
sq = x ** 0.5
more = 0
less = 0
for i in range(1, x + 1):
    if x % i == 0:
        if i > sq:
            more += 1
        if i < sq:
            less += 1
print(more - less)

Ответ: 0

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

Задача 12#38811

Утверждается, что количество делителей числа X  четно. Найдите количество пар делителей числа X = 2052336  , произведение которых равно исходному числу. При этом пары делителей выбираются следующим образом минимальный делитель * максимальный делитель, предминимальный делитель * предмаксимальный делитель и т.д. В ответе укажите два числа через пробел: сначала количество рассматриваемых пар, затем количеством пар, произведение которых равно исходному числу.

Показать ответ и решение
a = []
x = 2052336
for i in range(1, x + 1):
    if x % i == 0:
        a.append(i)
count = 0
n = len(a)
for i in range(n // 2):
    if a[i] * a[n - i - 1] == x:
        count += 1
print(n // 2, count)

Ответ: 60 60

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

Задача 13#37827

Тимофей любит число 7  и все числа кратные 999983.

Вопрос — где первое вхождение кратного K (K = 999983)  в последовательности 7,77,777,...  ? Если последовательность не содержит кратных 999983  , в ответе вместо этого запишите − 1  .

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

Поскольку i  -й член данной последовательности можно записать в виде 7⋅(1+ 10+ 102 + 103 + ⋅⋅⋅+ 10(i−1))  , посчитаем сумму геометрической прогрессии, поэтому искомым ответом является минимальное натуральное число i  , такое что 7 ⋅(10i − 1)  делится на 9K  . Если K  кратно 7  , вы можете рассмотреть, делится ли 10i− 1  на 9K∕∕7  вместо этого и в противном случае вы можете рассмотреть, делится ли   i
10 − 1  на 9K  . Поэтому давайте определим целое число L  таким образом, что L = 9K ∕7  если K  кратно 7  или L = 9K  в противном случае. Теперь достаточно найти минимальное натуральное число i такое, что 10i − 1  делится на L  , т. е. такое что остаток от деления 10i  на L  равен 1  . Если L  кратно 2  , то 10i  кратно 2  для любого положительного целого числа i  , поэтому его остаток деленное на L  никогда не будет равно 1  . То же самое относится, когда L  кратно 5  . Если ни одно из них не выполняется, то по теореме Эйлера выполняется 10φ(L ) ≡ 1  (mod L  ).

Поэтому, вам достаточно рассмотреть лишь подсчитать функцию эйлера за   √ --
O(  N)  и проверить все делители её значения. Потому что фактически в задаче вас просят найти показатель числа 10  по модулю L  .

Заметьте, что, не прибегая к приведенному выше математическому наблюдению, вы можете предположить, что «если ответ не равен − 1  , тогда ответ будет довольно маленьким;

Маленьким значит не более 9 ⋅K  . Поэтому вы можете рассмотреть первые 9K  значений.

Поэтому фактически в задаче всего лишь требуется подсчитать сумму геометрической прогрессии и написать перебор

Решение на С++

void solve() {
    int K;
    K = 999983;
    int cur = 10;
    for(int i = 0; i < 9 * K; ++i){
        if(7 * (cur - 1) % (9 * K) == 0){
            cout << i + 1 << "\n";
            return 0;
        }
        cur = (cur * 10) % (9 * K);
    }
    cout << "-1\n";
    return 0;
}

 

Решение на Python

k = 999983
ans = -1
s = 7
for i in range(10 ** 6):
    if s % k == 0:
        ans = i + 1
        break
    s = s * 10 + 7
print(ans)

Ответ: 999982

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

Задача 14#33621

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

— символ «?» означает ровно одну произвольную цифру;

— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

Среди натуральных чисел, не превышающих 108  , найдите все числа, соответствующие маске 12  *4  ?65  и делящиеся на 141  без остатка.

В ответе запишите количество найденных чисел.

Показать ответ и решение
count = 0
for x in "1234567890":
    count += (int("12" + "4" + x + "65") % 141 == 0)
    for y in "1234567890":
        count += (int("12" + y + "4" + x + "65") % 141 == 0)
        for z in "1234567890":
            count += (int("12" + y + z + "4" + x + "65") % 141 == 0)
print(count)

Ответ: 8

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

Задача 15#32446

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

— символ «?» означает ровно одну произвольную цифру;

— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

Среди натуральных чисел, не превышающих 106  , найдите все числа, где сумма всех делителей числа соответствует маске 1  *38  . В ответе запишите количество найденных чисел.

Показать ответ и решение
def summa(n):
    s = set()
    for i in range(1, int(n**0.5)+1):
        if n % i == 0:
            s.add(i)
            s.add(n // i)
    return sum(s)
ans = 0
res = []
for i in range(1, 1000001):
    num = str(summa(i))
    if len(num) >= 3:
        if num[0] == ’1’ and int(num) % 100 == 38:
            ans += 1
print(ans)

Ответ: 945

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

Задача 16#32439

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

— символ «?» означает ровно одну произвольную цифру;

— символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

Среди натуральных чисел, не превышающих 109  , найдите все числа, соответствующие маске 1?38?70∗ и делящиеся на 11  без остатка. В ответе запишите количество найденных чисел.

Показать ответ и решение
ans = 0
for i in range(10):
    for j in range(10):
        # пустая звёздочка
        s = ’1’ + str(i) + ’38’ + str(j) + ’70’
        if int(s) % 11 == 0:
            ans += 1
        #односимвольная звёздочка
        for w in range(10):
            s1 = ’1’ + str(i) + ’38’ + str(j) + ’70’ + str(w)
            if int(s1) % 11 == 0:
                ans += 1
        #двухсимвольная звёздочка
        for w in range(10):
            for z in range(10):
                s2 = ’1’ + str(i) + ’38’ + str(j) + ’70’ + str(w) + str(z)
                if int(s2) % 11 == 0:
                    ans += 1
print(ans)

Ответ: 1011

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

Задача 17#32438

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

Показать ответ и решение
def is_prime(n):
    for i in range(2, int(n**0.5)+1):
        if n % i == 0:
            return False
    return True
k = 0
for x in range(56846, 59034):
    if is_prime(x):
        k += 1
print(k)

Ответ: 204

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

Задача 18#30249

Назовём числа a  и b  числами-близнецами, если |a − b| = 2  .

Найдите наименьшее натуральное число, имеющее ровно 512 делителей, простые делители которого образуют не менее трёх пар чисел-близнецов. В ответе укажите число, а также все его простые делители.

Показать ответ и решение
from itertools import combinations_with_replacement


def prime(x):
    for i in range(2, int(x ** 0.5) + 1):
        if x % i == 0:
            return False
    return True


def count_del(x):
    ans = []
    for i in range(2, int(x ** 0.5) + 1):
        if x % i == 0:
            ans += [i]
            ans += [x // i]
    return sorted(list(set(ans)))


def check(a):
    ans = 1
    for i in range(len(a)):
        ans *= a[i]
        if ans > 512:
            return False
    return ans == 512


dels = count_del(512)
primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
# Если скобок 9 штук и каждое альфа равно 1
minim = 2 ** 511
# Если скобок 9 штук и каждое альфа равно 1
t = 1
degrees = [2] * 9
for k in range(len(degrees)):
    t *= (primes[k] ** (degrees[k] - 1))
minim = min(minim, t)
# Все остальные случаи
                                                                                                     
                                                                                                     
for j in range(2, 9):
    for i in combinations_with_replacement(dels, j):
        if check(i):
            t = 1
            degrees = i[::-1]
            for k in range(len(degrees)):
                t = t * (primes[k] ** (degrees[k] - 1))
            minim = min(minim, t)
print(minim, *[i for i in count_del(minim) if prime(i)])

Ответ: 17297280 2 3 5 7 11 13

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

Задача 19#30248

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

Показать ответ и решение
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, *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

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

Задача 20#30246

Найдите наибольшее натуральное число на отрезке [10000;5000000]  , которое имеет ровно 10  делителей. В ответе укажите число.

Показать ответ и решение
def divs(n):
    count = 0
    for i in range(1,int(n**0.5)+1):
        if n%i==0:
            count += 1
            if i!=n//i:
                count += 1
    return count
for x in range(5000000, 10000 - 1, -1):
    if divs(x) == 10:
        print(x)
        break

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