Задание EGEINF57CFD7: Делители, маски и отбор чисел

ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий

Открыть решение ↓ Ошибка или пожелание

Тип задачи: Делители, маски и отбор чисел.

Учебные темы: Алгоритмы обработки натуральных чисел, записанных в позиционных системах счисления: разбиение записи числа на отдельные цифры, нахождение суммы и произведения цифр, нахождение максимальной (минимальной) цифры. Представление числа в виде набора простых сомножителей. Алгоритм быстрого возведения в степень. Поиск простых чисел в заданном диапазоне с помощью алгоритма «решето Эратосфена».

Впишите правильный ответ.

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

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

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

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

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

В ответе запишите в первом столбце таблицы все найденные числа
в порядке возрастания, а во втором столбце –  соответствующие им результаты деления этих чисел на 9874.

Количество строк в таблице для ответа избыточно.

 



i
СВОЙСТВА ЗАДАНИЯ
КЭС:
3.4 Алгоритмы обработки натуральных чисел, записанных в позиционных системах счисления: разбиение записи числа на отдельные цифры, нахождение суммы и произведения цифр, нахождение максимальной (минимальной) цифры. Представление числа в виде набора простых сомножителей. Алгоритм быстрого возведения в степень. Поиск простых чисел в заданном диапазоне с помощью алгоритма «решето Эратосфена»
Тип ответа:Краткий ответ
Номер: 57CFD7
НЕ РЕШЕНО Ответить

Решение задания EGEINF57CFD7

Ответ: (8901677598; 901527), (8905627198; 901927), (8912617990; 902635), (8941667298; 905577), (8952607690; 906685), (8970607992; 908508), (8988647790; 910335)

Решение.
Ищем все натуральные n, удовлетворяющие маске 89*6?7?9?, ограничению n ≤ 10¹⁰ и делимости на 9874.
Каждый знак «?» заменяется ровно одной десятичной цифрой. Звёздочка допускает пустую строку и строки с нулями в начале: эти нули находятся внутри записи числа и должны сохраняться.
Без звёздочки в маске 8 позиций, из них 3 обозначены знаком «?». Граница 10¹⁰ отдельно проверяется по маске и ей не соответствует. Все остальные допустимые числа содержат не более 10 цифр.
Поэтому длина замены «*» принимает все целые значения от 0 до 2. При длине k имеется 10³ · 10ᵏ подстановок.
Общее число подстановок: 1000 + 10000 + 100000 = 111000.
Первый символ маски — фиксированная ненулевая цифра. Подстановки дают натуральные числа без ведущего нуля; различные наборы замен дают разные записи. Перебор длин и всех цифр охватывает каждое допустимое число.
Для каждого кандидата вычисляем частное и остаток при делении на 9874. Оставляем ровно те числа, у которых остаток равен нулю, затем упорядочиваем их по числовому значению.
Найденные числа и проверка каждой строки:
n = 8901677598: значения «?» слева направо: 7, 5, 8; «*» = «01».
9874 · 901527 = 8901677598; остаток 0.
n = 8905627198: значения «?» слева направо: 2, 1, 8; «*» = «05».
9874 · 901927 = 8905627198; остаток 0.
n = 8912617990: значения «?» слева направо: 1, 9, 0; «*» = «12».
9874 · 902635 = 8912617990; остаток 0.
n = 8941667298: значения «?» слева направо: 6, 2, 8; «*» = «41».
9874 · 905577 = 8941667298; остаток 0.
n = 8952607690: значения «?» слева направо: 0, 6, 0; «*» = «52».
9874 · 906685 = 8952607690; остаток 0.
n = 8970607992: значения «?» слева направо: 0, 9, 2; «*» = «70».
9874 · 908508 = 8970607992; остаток 0.
n = 8988647790: значения «?» слева направо: 4, 7, 0; «*» = «88».
9874 · 910335 = 8988647790; остаток 0.
Проверены все 111000 подстановок и отдельно верхняя граница; найдено 7 подходящих чисел. Других замен маски в допустимом диапазоне нет.
Проверка результата.
Воспроизводимая программа Python:

from itertools import product
from fnmatch import fnmatchcase

mask = '89*6?7?9?'
limit = 10 ** 10
divisor = 9874
fixed = len(mask.replace('*', ''))
lengths = range(10 - fixed + 1) if '*' in mask else [0]
numbers = set()
for length in lengths:
    pattern = mask.replace('*', '?' * length)
    for digits in product('0123456789', repeat=pattern.count('?')):
        it = iter(digits)
        text = ''.join(next(it) if c == '?' else c for c in pattern)
        numbers.add(int(text))
if fnmatchcase(str(limit), mask):
    numbers.add(limit)
for n in sorted(numbers):
    quotient, remainder = divmod(n, divisor)
    if remainder == 0:
        print(n, quotient)

Результат: в каждой строке слева n, справа частное.
8901677598 — 901527
8905627198 — 901927
8912617990 — 902635
8941667298 — 905577
8952607690 — 906685
8970607992 — 908508
8988647790 — 910335
Ответ: (8901677598; 901527), (8905627198; 901927), (8912617990; 902635), (8941667298; 905577), (8952607690; 906685), (8970607992; 908508), (8988647790; 910335).

Помочь улучшить сайт

Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINF57CFD7.

Сообщение увидит только команда сайта: на странице оно не публикуется.

Комментарии к решению

Комментарии видны всем посетителям сайта.

Комментариев пока нет. Будьте первым.

Чтобы оставить комментарий, войдите или зарегистрируйтесь.