решай.ai · шпаргалка

Задание 25: Обработка целочисленной информации

ЕГЭ Информатика

Как выглядит

Типичная формулировка: даётся определение маски (символ «?» — одна произвольная цифра, символ «» — произвольная последовательность цифр, включая пустую), приводится конкретная маска вида «12345?7?8» или «1?49341», указывается верхняя граница (например, 10910^9 или 101010^{10}) и делитель (23, 2023, 3123 и т.п.). Нужно найти все натуральные числа, соответствующие маске, не превышающие границу и кратные делителю, а затем выписать их в порядке возрастания. Иногда дополнительно требуется указать частное от деления каждого числа на делитель.

…

Что нужно знать

  • Позиционная запись: число длиной nn цифр записывается как N=∑i=0n−1di⋅10iN=\sum_{i=0}^{n-1} d_i\cdot 10^i, где dn−1d_{n-1} — старшая цифра.
  • «?» задаёт ровно одну цифру 00–99 в фиксированной позиции; «*» задаёт произвольную (в том числе пустую) последовательность цифр, то есть переменную длину блока.
  • Длина числа по маске равна сумме длин всех фиксированных символов и выбранной длины каждого блока «*».
  • Свойства остатков: (a+b) mod m=((a mod m)+(b mod m)) mod m(a+b)\bmod m=\big((a\bmod m)+(b\bmod m)\big)\bmod m, (a⋅b) mod m=((a mod m)⋅(b mod m)) mod m(a\cdot b)\bmod m=\big((a\bmod m)\cdot(b\bmod m)\big)\bmod m.
  • Линейное сравнение ax≡b(modm)ax\equiv b\pmod m имеет решение, если gcd⁡(a,m)\gcd(a,m) делит bb; при gcd⁡(a,m)=1\gcd(a,m)=1 решение единственно по модулю mm и находится через обратный элемент a−1 mod ma^{-1}\bmod m (расширенный алгоритм Евклида).
  • Признаки делимости на 2, 3, 5, 9, 10, 11 полезны для быстрой проверки отдельных кандидатов.
  • Верхняя граница числа жёстко ограничивает максимально возможную длину числа, а значит и допустимую длину блока «*» — это нужно посчитать первым делом.

Алгоритм

  1. Определить фиксированные и переменные части маски: сколько цифр задано жёстко, где стоят «?», где — «*».
  2. Из ограничения на число вычислить, какие длины блока «*» вообще допустимы.
  3. Для каждой допустимой длины записать число как сумму: фиксированная часть слева × степень десяти + значение блока × степень десяти + фиксированная часть справа, с учётом неизвестных «?» как переменных.
  4. Привести выражение к виду N≡0(modm)N\equiv0\pmod m и вычислить нужные степени десяти по модулю mm.
  5. Если неизвестных немного — перебрать их значения напрямую; если есть блок «*» — решить линейное сравнение относительно него.
  6. Отобрать решения, лежащие в допустимом диапазоне: для «?» это 00–99, для блока «*» — 00–10k−110^k-1, включая случаи с нулями внутри блока.
  7. Собрать все числа, отсортировать по возрастанию, при необходимости посчитать частное. …

Ловушки

  • Забыть, что «*» может задавать пустую последовательность — пропускается вариант минимальной длины числа.
  • Неверно определить степень десяти для блока «*» из-за ошибки в подсчёте позиций фиксированных символов справа от блока.
  • Не учесть ограничение сверху и рассмотреть длины числа, которые заведомо дают числа больше границы.
  • Арифметическая ошибка при вычислении 10n mod m10^n\bmod m — степени лучше считать пошагово, беря остаток на каждом шаге.
  • Забыть про возможные нули внутри блока «*», если он стоит не в самом начале числа — такие варианты нужно учитывать.
  • Ограничить перебор блока «*» диапазоном 00–10k−1−110^{k-1}-1 вместо 00–10k−110^k-1, случайно исключив числа с нулём в начале блока.
  • Ошибка при подсчёте частного во второй колонке ответа — стоит проверять деление в столбик или обратным умножением.
  • Выписать числа не по возрастанию или продублировать варианты из разных допустимых длин.
reshay.ai/ege/informatika/zadanie-25 — задачи с разборами и тренажёр

Полный гайд и задачи задания 25 →