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

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

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

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

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

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

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

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

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

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

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

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

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

 



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

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

Ответ: (351261495; 183235), (3212614035; 1675855), (3412614645; 1780185), (3712414275; 1936575), (3912414885; 2040905)

Решение.
Ищем все натуральные n, удовлетворяющие маске 3?12?14*5, ограничению n ≤ 10¹⁰ и делимости на 1917.
Каждый знак «?» заменяется ровно одной десятичной цифрой. Звёздочка допускает пустую строку и строки с нулями в начале: эти нули находятся внутри записи числа и должны сохраняться.
Без звёздочки в маске 8 позиций, из них 2 обозначены знаком «?». Граница 10¹⁰ отдельно проверяется по маске и ей не соответствует. Все остальные допустимые числа содержат не более 10 цифр.
Поэтому длина замены «*» принимает все целые значения от 0 до 2. При длине k имеется 10² · 10ᵏ подстановок.
Общее число подстановок: 100 + 1000 + 10000 = 11100.
Первый символ маски — фиксированная ненулевая цифра. Подстановки дают натуральные числа без ведущего нуля; различные наборы замен дают разные записи. Перебор длин и всех цифр охватывает каждое допустимое число.
Для каждого кандидата вычисляем частное и остаток при делении на 1917. Оставляем ровно те числа, у которых остаток равен нулю, затем упорядочиваем их по числовому значению.
Найденные числа и проверка каждой строки:
n = 351261495: значения «?» слева направо: 5, 6; «*» = «9».
1917 · 183235 = 351261495; остаток 0.
n = 3212614035: значения «?» слева направо: 2, 6; «*» = «03».
1917 · 1675855 = 3212614035; остаток 0.
n = 3412614645: значения «?» слева направо: 4, 6; «*» = «64».
1917 · 1780185 = 3412614645; остаток 0.
n = 3712414275: значения «?» слева направо: 7, 4; «*» = «27».
1917 · 1936575 = 3712414275; остаток 0.
n = 3912414885: значения «?» слева направо: 9, 4; «*» = «88».
1917 · 2040905 = 3912414885; остаток 0.
Проверены все 11100 подстановок и отдельно верхняя граница; найдено 5 подходящих чисел. Других замен маски в допустимом диапазоне нет.
Проверка результата.
Воспроизводимая программа Python:

from itertools import product
from fnmatch import fnmatchcase

mask = '3?12?14*5'
limit = 10 ** 10
divisor = 1917
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, справа частное.
351261495 — 183235
3212614035 — 1675855
3412614645 — 1780185
3712414275 — 1936575
3912414885 — 2040905
Ответ: (351261495; 183235), (3212614035; 1675855), (3412614645; 1780185), (3712414275; 1936575), (3912414885; 2040905).

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

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

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

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

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

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

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