решай.ai · шпаргалка
Задание 25: Обработка целочисленной информации
ЕГЭ Информатика
Как выглядит
Типичная формулировка: даётся определение маски (символ «?» — одна произвольная цифра, символ «» — произвольная последовательность цифр, включая пустую), приводится конкретная маска вида «12345?7?8» или «1?49341», указывается верхняя граница (например, или ) и делитель (23, 2023, 3123 и т.п.). Нужно найти все натуральные числа, соответствующие маске, не превышающие границу и кратные делителю, а затем выписать их в порядке возрастания. Иногда дополнительно требуется указать частное от деления каждого числа на делитель.
…
Что нужно знать
- Позиционная запись: число длиной цифр записывается как , где — старшая цифра.
- «?» задаёт ровно одну цифру – в фиксированной позиции; «*» задаёт произвольную (в том числе пустую) последовательность цифр, то есть переменную длину блока.
- Длина числа по маске равна сумме длин всех фиксированных символов и выбранной длины каждого блока «*».
- Свойства остатков: , .
- Линейное сравнение имеет решение, если делит ; при решение единственно по модулю и находится через обратный элемент (расширенный алгоритм Евклида).
- Признаки делимости на 2, 3, 5, 9, 10, 11 полезны для быстрой проверки отдельных кандидатов.
- Верхняя граница числа жёстко ограничивает максимально возможную длину числа, а значит и допустимую длину блока «*» — это нужно посчитать первым делом.
Алгоритм
- Определить фиксированные и переменные части маски: сколько цифр задано жёстко, где стоят «?», где — «*».
- Из ограничения на число вычислить, какие длины блока «*» вообще допустимы.
- Для каждой допустимой длины записать число как сумму: фиксированная часть слева × степень десяти + значение блока × степень десяти + фиксированная часть справа, с учётом неизвестных «?» как переменных.
- Привести выражение к виду и вычислить нужные степени десяти по модулю .
- Если неизвестных немного — перебрать их значения напрямую; если есть блок «*» — решить линейное сравнение относительно него.
- Отобрать решения, лежащие в допустимом диапазоне: для «?» это –, для блока «*» — –, включая случаи с нулями внутри блока.
- Собрать все числа, отсортировать по возрастанию, при необходимости посчитать частное. …
Ловушки
- Забыть, что «*» может задавать пустую последовательность — пропускается вариант минимальной длины числа.
- Неверно определить степень десяти для блока «*» из-за ошибки в подсчёте позиций фиксированных символов справа от блока.
- Не учесть ограничение сверху и рассмотреть длины числа, которые заведомо дают числа больше границы.
- Арифметическая ошибка при вычислении — степени лучше считать пошагово, беря остаток на каждом шаге.
- Забыть про возможные нули внутри блока «*», если он стоит не в самом начале числа — такие варианты нужно учитывать.
- Ограничить перебор блока «*» диапазоном – вместо –, случайно исключив числа с нулём в начале блока.
- Ошибка при подсчёте частного во второй колонке ответа — стоит проверять деление в столбик или обратным умножением.
- Выписать числа не по возрастанию или продублировать варианты из разных допустимых длин.
reshay.ai/ege/informatika/zadanie-25 — задачи с разборами и тренажёр