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

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

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

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

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

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

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

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

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

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

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

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

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

 



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

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

Ответ: (3050207; 1009), (30529277; 10099), (33552277; 11099), (35517227; 11749), (36575277; 12099), (38540227; 12749), (39598277; 13099)

Решение.
Ищем все натуральные n, удовлетворяющие маске 3?5*2?7, ограничению n ≤ 10⁸ и делимости на 3023.
Каждый знак «?» заменяется ровно одной десятичной цифрой. Звёздочка допускает пустую строку и строки с нулями в начале: эти нули находятся внутри записи числа и должны сохраняться.
Без звёздочки в маске 6 позиций, из них 2 обозначены знаком «?». Граница 10⁸ отдельно проверяется по маске и ей не соответствует. Все остальные допустимые числа содержат не более 8 цифр.
Поэтому длина замены «*» принимает все целые значения от 0 до 2. При длине k имеется 10² · 10ᵏ подстановок.
Общее число подстановок: 100 + 1000 + 10000 = 11100.
Первый символ маски — фиксированная ненулевая цифра. Подстановки дают натуральные числа без ведущего нуля; различные наборы замен дают разные записи. Перебор длин и всех цифр охватывает каждое допустимое число.
Для каждого кандидата вычисляем частное и остаток при делении на 3023. Оставляем ровно те числа, у которых остаток равен нулю, затем упорядочиваем их по числовому значению.
Найденные числа и проверка каждой строки:
n = 3050207: значения «?» слева направо: 0, 0; «*» = «0».
3023 · 1009 = 3050207; остаток 0.
n = 30529277: значения «?» слева направо: 0, 7; «*» = «29».
3023 · 10099 = 30529277; остаток 0.
n = 33552277: значения «?» слева направо: 3, 7; «*» = «52».
3023 · 11099 = 33552277; остаток 0.
n = 35517227: значения «?» слева направо: 5, 2; «*» = «17».
3023 · 11749 = 35517227; остаток 0.
n = 36575277: значения «?» слева направо: 6, 7; «*» = «75».
3023 · 12099 = 36575277; остаток 0.
n = 38540227: значения «?» слева направо: 8, 2; «*» = «40».
3023 · 12749 = 38540227; остаток 0.
n = 39598277: значения «?» слева направо: 9, 7; «*» = «98».
3023 · 13099 = 39598277; остаток 0.
Проверены все 11100 подстановок и отдельно верхняя граница; найдено 7 подходящих чисел. Других замен маски в допустимом диапазоне нет.
Проверка результата.
Воспроизводимая программа Python:

from itertools import product
from fnmatch import fnmatchcase

mask = '3?5*2?7'
limit = 10 ** 8
divisor = 3023
fixed = len(mask.replace('*', ''))
lengths = range(8 - 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, справа частное.
3050207 — 1009
30529277 — 10099
33552277 — 11099
35517227 — 11749
36575277 — 12099
38540227 — 12749
39598277 — 13099
Ответ: (3050207; 1009), (30529277; 10099), (33552277; 11099), (35517227; 11749), (36575277; 12099), (38540227; 12749), (39598277; 13099).

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

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

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

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

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

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

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