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

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

Задача 1#88288

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

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

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

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

Например, маске 123*4?5 соответствуют числа 123405 и 12300405. Среди натуральных чисел, не превышающих 1010  , найдите все числа, соответствующие маске &123*321?, делящиеся на 2004 без остатка. В ответе запишите первые пять чисел в порядке возрастания, и через пробел – соответствующие им результаты деления этих чисел на 2004.

Показать ответ и решение
from itertools import product
def simple(x):return x > 1 and all(x % y for y in range(2,int(x**0.5)+1))
digits = ’0123456789’
odd_digits = ’13579’
res = []
for i in range(4):
    for digit_1 in product(odd_digits,repeat = i):
        for j in range(4):
            for digit_2 in product(digits,repeat = j):
                for digit_3 in product(digits,repeat = 1):
                    res += [int(’’.join(digit_1) + ’123’ + ’’.join(digit_2) + ’321’ + ’’.join(digit_3))]
for x in sorted(set(res)):
    if x <= 10**10 and x % 2004 == 0:
        print(x,x//2004)

Ответ: 123853212 61803 1230063216 613804 1231063212 614303 1235073216 616304 1236073212 616803

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

Задача 2#88287

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

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

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

Например, маске 123*4?5 соответствуют числа 123405 и 12300405. Среди натуральных чисел, не превышающих  109  , найдите все числа, соответствующие маске 3*3?12, делящиеся на 3952 без остатка, у которых также сумма цифр числа является нечётной. В ответе запишите первые пять чисел в порядке возрастания, и через пробел – соответствующие им результаты деления этих чисел на 3952.

Показать ответ и решение
Способ решения 1:
from fnmatch import fnmatch
count = 0
for x in range(35568,10**9+1,3952):
    if fnmatch(str(x),’3*3?12’) and sum(map(int,str(x))) % 2 != 0:
        count += 1
        print(x,x//3952)
        if count > 4:
            break
Способ решения 2:
from itertools import product
digits = ’0123456789’
res = []
for i in range(5):
    for digit_1 in product(digits,repeat = i):
        for digit_2 in product(digits,repeat = 1):
            res += [int(’3’+’’.join(digit_1) + ’3’ + ’’.join(digit_2) + ’12’)]
for x in sorted(set(res)):
    if x <= 10**9 and x % 3952 == 0 and sum(map(int,str(x))) % 2 != 0:
        print(x,x//3952)


Ответ: 303043312 76681 305513312 77306 306303712 77506 323593712 81881 332683312 84181

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

Задача 3#88286

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

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

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

Например, маске 123*4?5 соответствуют числа 123405 и 12300405. Среди натуральных чисел, не превышающих  107  , найдите все числа, соответствующие маске 2*56??, делящиеся на 2048 без остатка, у которых более 5 делителей, соответствующих маске 1*4. В ответе запишите все найденные числа в порядке возрастания, и через пробел – соответствующие им результаты деления этих чисел на 2048.

Показать ответ и решение
Способ решения 1:
from fnmatch import fnmatch
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)
for x in range(4096,10**7+1,2048):
    if fnmatch(str(x),’2*56??’):#если число удовлетворяет маске числа
        d = [i for i in divs(x) if fnmatch(str(i),’1*4’)]#делаем список,в котором будут делители,
        #удовлетворяющие маске делителей.
        if len(d) > 5:
            print(x,x//2048)
Способ решения 2:
from itertools import product
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)
digits = ’0123456789’
res = []#список, в котором будут числа удовлетворяющие маске числа
need_div = []#список, в котором будут числа удовлетворяющие маске делителей
#формирование чисел по определенной маске чисел
for i in range(3):
    for digit_1 in product(digits,repeat = i):
        for digit_2 in product(digits,repeat = 1):
            for digit_3 in product(digits,repeat = 1):
                res += [int(’2’ + ’’.join(digit_1) + ’56’ + ’’.join(digit_2) + ’’.join(digit_3))]
#формирование чисел по определенной маске делителей
for i in range(6):
    for digit_1 in product(digits,repeat = i):
        need_div += [int(’1’+’’.join(digit_1) + ’4’)]
for x in sorted(set(res)):#проход по всевозможным получившимся числам
    if x <= 10**7 and x % 2048 == 0:
        d = [i for i in divs(x) if i in need_div]#список, в котором будут делители числа,
        # удовлетворяющие маске делителей
        if len(d) > 5:#если таких делителей больше 5
            print(x,x//2048)

Ответ: 2715648 1326

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

Задача 4#88285

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

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

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

Например, маске 123*4?5 соответствуют числа 123405 и 12300405. Среди натуральных чисел, не превышающих  109  , найдите все числа, соответствующие маске 1*3577?0, делящиеся на 1975 без остатка. В ответе запишите все найденные числа в порядке возрастания, и через пробел – соответствующие им результаты деления этих чисел на 1975.

Показать ответ и решение
Способ решения 1:
from fnmatch import fnmatch
for x in range(1358800,10**9+1,1975):
    if fnmatch(str(x),’1*3577?0’):
        print(x,x//1975)
Способ решения 2:
’’’
Идея решения заключается в том, чтобы по частям собирать число, удовлетворяющее маске
и затем проверять его на кратность.
Такое решение оптимальнее по времени поскольку мы не проверяем числа не подходящие по маске,
а сразу составляем те,
что нам подходят.
’’’

from itertools import product#импортируем модуль product из itertools
digits = ’0123456789’#всевозможные цифры
res = []#список, в который мы будем сохранять числа
for i in range(3):#проведя анализ, можно понять, что в звёздочке не может быть больше двух цифр,
    #по этой причине делаем цикл от 0 до 2 включительно.
    for digit_1 in product(digits,repeat = i):#делаем произвольную подпоследовательность из цифр,
        #таким способом, мы симулируем звёздочку
        for digit_2 in product(digits,repeat = 1):#такой записью, мы симулируем знак вопроса
            res += [int(’1’ + ’’.join(digit_1) + ’3577’ + ’’.join(digit_2) + ’0’)]
            #собираем нашу маску по частям, функция join переводит элементы кортежа, списка в строку.
for x in sorted(set(res)):#проходимся по всем получившимся числам
    if x <= 10**9 and x % 1975 == 0:
        print(x,x//1975)#вывод числа и его частного

Ответ: 106357700 53852 112357750 56890 185357700 93852 191357750 96890

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

Задача 5#86470

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

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

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

Например, маске 123*4?5 соответствуют числа 123405 и 12300405.

Среди натуральных чисел, не превышающих 107  , найдите все числа, соответствующие маске 3*4?50, а количество четных цифр числа больше количества нечетных.

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

Показать ответ и решение
t = []
for x in range(10**3, 10**7+1):
    s = str(x)
    cht = [int(i) for i in s if int(i) % 2 == 0]
    ncht = [int(i) for i in s if int(i) % 2 != 0]
    if (s[0] == ’3’) and (s[-2:] == ’50’) and (s[-4] == ’4’) and len(cht) > len(ncht):
        t.append(x)
print(len(t))

Ответ: 530

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

Задача 6#86469

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

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

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

Например, маске 123*4?5 соответствуют числа 123405 и 12300405.

Среди натуральных чисел, не превышающих 108  , найдите все числа, являющимися полными квадратами, соответствующие маске 82??9* и имеющих более 25 делителей.

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

Показать ответ и решение
for x in range(10**4, 10**8+1):
    c = set()
    s = str(x)
    if x**0.5 == int(x**0.5):
        for i in range(1, int(x**0.5)+1):
            if x % i == 0 and s[:2] == ’82’ and s[4] == ’9’:
                c.add(i)
                c.add(x//i)
    if len(c) > 25:
        print(x)

Ответ: 8236900 82119844 82519056 82719025 82919236

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

Задача 7#86468

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

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

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

Например, маске 123*4?5 соответствуют числа 123405 и 12300405.

Среди натуральных чисел, не превышающих 1012  , найдите все числа, соответствующие маске 137?15*7*50, делящиеся на 178750 без остатка.

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

Показать ответ и решение
from fnmatch import fnmatch
for x in range(137101250,10**12+1,178750):
    if fnmatch(str(x),’137?15*7*50’):
        print(x,x//178750)

Ответ: 137015271250 766519 137015628750 766521 137115013750 767077 137115371250 767079 137115728750 767081 137215113750 767637 137215471250 767639 137215828750 767641 137315213750 768197 137315571250 768199 137315928750 768201 137415313750 768757 137415671250 768759 137515413750 769317 137515771250 769319 137615513750 769877 137615871250 769879 137715613750 770437 137715971250 770439 137815713750 770997 137915098750 771553 137915813750 771557

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

Задача 8#86467

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

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

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

Например, маске 123*4?5 соответствуют числа 123405 и 12300405.

Среди натуральных чисел, находящихся в интервале [103;106  ], найдите все числа, соответствующие маске 16* и имеющих ровно 13 нетривиальных делителей.

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

Показать ответ и решение
for x in range(10**3, 10**6+1):
    c = set()
    s = str(x)
    if x**0.5 == int(x**0.5):
        for i in range(2, int(x**0.5)+1):
            if x % i == 0 and s[:2] == ’16’:
                c.add(i)
                c.add(x//i)
    if len(c) == 13:
        print(x)

Ответ: 16384 163216 169744

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

Задача 9#86466

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

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

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

Например, маске 123*4?5 соответствуют числа 123405 и 12300405.

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

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

Показать ответ и решение
for x in range(1000, 10**8+1):
    s = str(x)
    if (s[1] == ’5’) and (s[3:5] == ’22’) and (s[-1] == ’4’) and int(x**0.5)**2 == x:
        print(x)

Ответ: 25522704 35022724

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

Задача 10#86464

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

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

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

– символ «#» означает любое простое двухзначное число

Например, маске 123*4?5 соответствуют числа 123405 и 12300405.

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

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

Показать ответ и решение
from fnmatch import *
def f(x):
    for i in range(2, int(x**0.5)+1):
        if x % i == 0:
            return False
    return True
t = []
for i in range(10, 100):
    if f(i):
        t.append(i)
res = []
for i in range(10**6):
    if fnmatch(str(i), ’1*1’):
        for j in t:
            for k in t:
                n = int(str(j) + str(i) + str(k))
                if n <= 10**10:
                    res.append(n)

print(len(set(res)))

Ответ: 4899951

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

Задача 11#86463

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

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

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

– символ «#» означает любое простое трехзначное число

Например, маске 123*4?5 соответствуют числа 123405 и 12300405.

Среди натуральных чисел, не превышающих   11
10  , найдите все числа, соответствующие маске 1?0*12#10

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

Показать ответ и решение
from fnmatch import *
#функция для проверки на простоту
def f(x):
    for i in range(2, int(x**0.5)+1):
        if x % i == 0:
            return False
    return True
t = [] #список простых чисел
for i in range(100, 1000):
    if f(i):
        t.append(i)
res = [] #список искомых чисел
for i in range(10**7):
    if fnmatch(str(i), ’1?0*12’):
        for j in t:
            if len(str(i)+str(j)+’10’) <= 11:
                res.append(str(i)+str(j)+’10’)
            else:
                break
print(len(res))

Ответ: 15730

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

Задача 12#86461

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

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

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

Например, маске 123*4?5 соответствуют числа 123405 и 12300405.

Среди натуральных чисел, принадлежащих отрезку [106;107  ], найдите все числа, которые соответствуют маске 1?904*4, а сумма их цифр делится без остатка на 34.

В ответ запишите числа в порядке возрастания через пробел.

Показать ответ и решение
for x in range(10**6, 10**7+1):
    s = str(x)
    if (s[0] == ’1’) and (s[2:5] == ’904’) and (s[-1] == ’4’) and (sum(int(i) for i in s) % 34 == 0):
        print(x)

Ответ: 1790494 1890484 1990474

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

Задача 13#86460

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

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

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

Например, маске 123*4?5 соответствуют числа 123405 и 12310405.

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

В ответ запишите пары чисел (найденное число и результат деления его на 965) в порядке возрастания через пробел.

Показать ответ и решение
for x in range(122555, 10**9, 965):
    s = str(x)
    a = s[2:-4]
    sm = sum(int(i) for i in a)
    if sm > 0:
        if (int(a) % sm == 0) and (s[:2] == ’12’) and (s[-4] == ’3’) and \
        (int(s[-3]) % 3 == 0) and (s[-2:] == ’45’):
            print(x, x // 965)

Ответ: 121563945 125973 123243045 127713 124053645 128553 127353945 131973

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

Задача 14#86459

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

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

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

Например, маске 123*4?5 соответствуют числа 123405 и 12312405.

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

В ответ запишите пары чисел (найденное число и результат деления его на 10089) в порядке возрастания через пробел.

Показать ответ и решение
for x in range(10089, 10**9, 10089):
    s = str(x)
    t = [i for i in s[1:-3] if int(i) % 2 == 0]
    if (s[-3:] == ’309’) and (int(s[0]) % 2 == 0) and (not t):
        print(x, x // 10089)

Ответ: 473991309 46981 655593309 64981 675771309 66981 837195309 82981 857373309 84981 877551309 86981

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

Задача 15#86458

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

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

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

Например, маске 123*4?5 соответствуют числа 123405 и 12300405.

Среди натуральных чисел, не превышающих 109  , найдите все числа, соответствующие маске 11*777*0, делящиеся на 8450 без остатка.

В ответ запишите пары чисел (найденное число и результат деления его на 8450) в порядке возрастания через пробел.

Показать ответ и решение
for x in range(8450, 10**9+1, 8450):
    s = str(x)
    if (s[:2] == ’11’) and (’777’ in s[2:-1]) and (s[-1] == ’0’):
        print(x, x // 8450)

Ответ: 114877750 13595 115477700 13666 117776100 13938

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

Задача 16#86457

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

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

– символ «&» означает пару произвольных цифр вида «четная+нечетная»;

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

Например, маске 123&4?5 соответствуют числа 12340405 и 12322405.

Среди натуральных чисел, не превышающих   9
10  , найдите все числа, соответствующие маске 2*11&0?, делящиеся на 6170 без остатка.

В ответ запишите пары чисел (найденное число и результат деления его на 6170) в порядке возрастания через пробел.

Показать ответ и решение
for x in range(6170, 10**9+1, 6170):
    s = str(x)
    if ((s[0] == ’2’) and (s[-6:-4] == ’11’) and (int(s[-4]) % 2  == 0)
    and (int(s[-3]) % 2 == 1) and (s[-2] == ’0’)):
        print(x, x // 6170)

Ответ: 208114100 33730 256116700 41510 266112100 43130

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

Задача 17#86455

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

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

– символ «&» означает пару четных произвольных цифр;

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

Например, маске 123&4?5 соответствуют числа 12340405 и 12322405.

Среди натуральных чисел, не превышающих   9
10  , найдите все числа, соответствующие маске ?189&*, делящиеся на 36170 без остатка.

В ответ запишите пары чисел (найденное число и результат деления его на 36170) в порядке возрастания через пробел.

Показать ответ и решение
for x in range(36170, 10**9+1, 36170):
    s = str(x)
    if (s[1:4] == ’189’) and (int(s[4]) % 2  == 0) and (int(s[5]) % 2 == 0):
        print(x, x // 36170)

Ответ: 118926960 3288 218900840 6052 418920940 11582 618904870 17111 818924970 22641

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

Задача 18#86454

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

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

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

Например, маске 123*4?5 соответствуют числа 123405 и 12300405.

Среди натуральных чисел, не превышающих 107  , найдите все числа, соответствующие маске ?75*47?, делящиеся на 290 без остатка.

В ответ запишите пары чисел (найденное число и результат деления его на 290) в порядке возрастания через пробел.

Показать ответ и решение
for x in range(290, 10**7+1, 290):
    s = str(x)
    if (s[1:3] == ’75’) and (s[-3:-1] == ’47’):
        print(x, x // 290)

Ответ: 1752470 6043 3753470 12943 5754470 19843 7755470 26743 9756470 33643

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

Задача 19#86453

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

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

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

Например, маске 123*4?5 соответствуют числа 123405 и 12300405.

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

В ответ запишите пары чисел (найденное число и результат деления его на 1034) в порядке возрастания через пробел.

Показать ответ и решение
for x in range(1034, 10**9+1, 1034):
    s = str(x)
    if (s[0:2] == ’63’) and (s[-1] == ’4’) and (s[-5:-2] == ’095’):
        print(x, x // 1034)

Ответ: 631609594 610841 635409544 614516

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

Задача 20#84152

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

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

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

Например, маске 123*4?5 соответствуют числа 123405 и 12300405.

Среди натуральных чисел, не превышающих 109  , найдите все числа, соответствующие маске 8?4∗2?9 ∗8  , делящиеся на 17253 без остатка.

В ответе запишите пары чисел: найденное число и соответствующие ему результат деления на 17253. Пары расположите в порядке возрастания найденных чисел. Все числа в ответе отделите друг от друга пробелом.

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

for x in range(17_253, 10 ** 9 + 1, 17_253):
    s = str(x)
    if fnmatch(s, ’8?4*2?9*8’):
        print(x, x // 17_253)

Ответ: 824279328 47776 854299548 49516 884492298 51266
Рулетка
Вы можете получить скидку в рулетке!