Уточним задачу
Спросим о классе, предмете и цели. Если есть решённая работа, пригодятся ваши ответы.
Утверждённая демоверсия ФИПИ · 2027
От условия — к понятному решению. Объясняем ход рассуждений, проверяем ответы и показываем, где легко ошибиться. Нужное задание можно открыть сразу.
Все 27 заданий окончательной демоверсии ФИПИ ЕГЭ 2027 по информатике: 30 разобранных примеров, включая три варианта №14 и оба варианта №25. Практические расчёты выполнены на официальных дополнительных файлах, а не на иллюстративных примерах из PDF.
Условия кратко пересказаны. Тексты, рисунки и формулировки можно сверить с приложенными страницами ФИПИ. Номера страниц соответствуют печатной нумерации. Учебные пояснения публикует Хорошист; это не публикация от имени ФИПИ.
Сначала попробуйте выполнить задание самостоятельно. Затем сравните ответ и рассуждения. Для развёрнутых заданий приведён пример подходящего ответа: возможны и другие формулировки, соответствующие критериям.
Для файловых заданий скачайте комплект ниже. В нём оригинальные материалы ФИПИ с восстановленными русскими именами и наш solve.py, который воспроизводит числовые ответы. Распакуйте архив целиком и выполните python3 solve.py; для ЕГЭ достаточно стандартной библиотеки Python 3.
Скачать исходные файлы и проверочный Python
Номера страниц у заданий — печатные номера в документе ФИПИ. В №14 и №25 примеры «ИЛИ» разобраны отдельно. Код в коротких фрагментах предполагает, что исходный файл находится рядом с программой; общий solve.py сам находит материалы внутри комплекта.
Задание 1
На схеме дороги CF, CB, BE, EA, AF, FD, DB, DE. В таблице те же вершины обозначены числами 1–6: 1–2 = 39, 1–5 = 53, 1–6 = 30, 2–3 = 21, 3–4 = 8, 3–5 = 3, 4–5 = 13, 4–6 = 5. Других дорог нет. Требуется сумма длин ЕА и ВС.
26
Перебор всех 6! соответствий дал ровно два изоморфизма; сумма в обоих равна 26.
Где легко ошибиться. Порядок вершин на рисунке не обязан совпадать с номерами таблицы.
К номерам заданий ↑Задание 2
F = ((x ≡ ¬y) → ¬(w → x)) ∨ ¬z. В трёх различных строках F = 0. Значения четырёх неизвестных столбцов: (—, 0, 1, 0), (0, —, —, 0), (—, 1, 1, —). Определить переменные слева направо.
yxzw
Полный перебор 24 перестановок столбцов и всех ложных строк оставил единственный порядок yxzw.
Где легко ошибиться. Пустая клетка означает неизвестное значение, а не ноль; строки не могут повторяться.
К номерам заданий ↑Задание 3
В demo_3.ods три связанные таблицы: движение товаров, товары и магазины. Найти массу в килограммах всех видов зефира, поступивших с 5 по 19 июня 2025 года включительно в магазины на Прибрежной улице. Учитывается поступление, а не продажа.
1630
Фактически обработан официальный ODS: магазины M9/M11, четыре артикула, 17 поступлений; сумма 1 630 000 г.
Где легко ошибиться. Не исключайте граничные даты и не умножайте количество упаковок на цену.
К номерам заданий ↑Задание 4
Для букв Б, Н, Л заданы коды 00, 010, 111. Для букв К и О нужно выбрать коды, чтобы выполнялось условие Фано и слово КОЛОБОК кодировалось минимальным числом битов.
17
Коды 00, 010, 111, 011, 10 попарно не являются префиксами друг друга.
Где легко ошибиться. Минимизируется длина всего слова, а не сумма длин двух новых кодов.
К номерам заданий ↑Задание 5
Для натурального N строят двоичную запись. Если N чётно, слева и справа приписывают 11; если нечётно, слева приписывают 1, справа 00. Полученная запись задаёт R. Найти минимальное R, превышающее 95.
values = []
for n in range(1, 26):
b = bin(n)[2:]
r = int('11' + b + '11' if n % 2 == 0 else '1' + b + '00', 2)
if r > 95:
values.append(r)
print(min(values))100
Перебор N = 1…999 также дал минимум 100 при N = 9.
Где легко ошибиться. Условие R > 95 относится к результату, не к исходному числу.
К номерам заданий ↑Задание 6
Черепаха начинает в (0;0), направлена вдоль положительной полуоси y. Первый цикл: 6 раз [вперёд 24; направо 90; вперёд 30; направо 90]. Затем с поднятым хвостом: вперёд 2; направо 90; вперёд 10; налево 90. Второй цикл с опущенным хвостом: 6 раз [вперёд 75; направо 90; вперёд 71; направо 90]. Посчитать целочисленные точки в общей части фигур, включая границы.
483
Независимый подсчёт всех пар целых координат в пересечении даёт 483.
Где легко ошибиться. Граница включена: в каждом диапазоне нужно прибавить 1.
К номерам заданий ↑Задание 7
Стереозапись длится 147 секунд, частота дискретизации 32 кГц, разрешение 16 бит на отсчёт. Сжатия нет. Найти объём записи в Кбайт без служебных данных.
18375
Обратный пересчёт 18 375 · 1024 · 8 возвращает 150 528 000 бит.
Где легко ошибиться. 32 кГц — 32 000 отсчётов/с, но 1 Кбайт в этом задании — 1024 байта.
К номерам заданий ↑Задание 8
Все пятибуквенные слова из А, Е, К, Н, Т, Ц перечислены в алфавитном порядке, нумерация начинается с 1. Найти наименьший чётный номер слова, которое не начинается с А, Е или К и содержит хотя бы одну Т.
3914
Полный перебор 6⁵ слов с нумерацией от 1 первым нашёл НААТЕ под номером 3914.
Где легко ошибиться. Условие чётности относится к номеру с единицы, а не к коду с нуля.
К номерам заданий ↑Задание 9
В demo_9.ods каждая строка содержит пять натуральных чисел. Посчитать строки, в которых все пять чисел различны и удвоенная сумма наибольшего и наименьшего больше суммы трёх остальных.
count = sum(len(set(row)) == 5 and 3*(min(row)+max(row)) > sum(row)
for row in rows)
print(count)4874
Результат получен на всех 28 000 строках официального файла; чтение ODS входит в solve.py.
Где легко ошибиться. Знак строгий: равенство не подходит. Нельзя проверять только соседние числа на различие.
К номерам заданий ↑Задание 10
В demo_10.odt дан текст повести А. И. Куприна «Поединок». Найти, сколько раз во II главе встречается отдельное слово «и» или «И».
import re
count = len(re.findall(r'(?<![А-Яа-яЁё])и(?![А-Яа-яЁё])', chapter, re.I))
print(count)93
Из официального ODT извлечён текст главы II объёмом 13 791 символ; выполнен поиск без учёта регистра.
Где легко ошибиться. Не считайте букву «и» внутри слов и не захватывайте соседние главы.
К номерам заданий ↑Задание 11
Идентификатор имеет длину 157 символов. Каждый символ кодируется одинаковым минимальным числом битов, каждый идентификатор занимает целое минимальное число байтов. Для 12 450 идентификаторов выделено не более 955 Кбайт. Найти максимальную мощность алфавита.
8
При 4 битах потребовалось бы 983 550 байтов, что больше 977 920; при 3 битах лимит соблюдается.
Где легко ошибиться. Округлять вверх до байтов нужно каждый идентификатор отдельно.
К номерам заданий ↑Задание 12
На ленте двоичная запись числа 2025, вокруг пустые символы λ. В q0 головка стоит на λ справа от числа: команда λ,L,q1. В q1 на 0 и 1 символ сохраняется и головка идёт влево; на λ записывается 1, переход L,q2. В q2 на λ машина останавливается. Найти итоговое число в десятичной системе.
4073
Перевод итоговой двоичной строки в десятичную систему даёт 4073.
Где легко ошибиться. Единица приписывается слева: это не умножение числа на 2 и не добавление единицы справа.
К номерам заданий ↑Задание 13
Узел имеет IP 95.106.135.150, маска сети 255.255.255.0. Найти сумму чисел, составляющих адрес сети.
336
Побитовая операция для четырёх октетов независимо дала [95,106,135,0].
Где легко ошибиться. В ответе нужна сумма октетов сети, а не самого узла.
К номерам заданий ↑Задание 14 · 3 примера
В выражении 27x98876₂₂ + 26x51₂₂ + 711x5₂₂ символ x — одна и та же цифра основания 22. Найти минимальный x, при котором сумма делится на 21, и записать частное от деления суммы на 21 в десятичной системе.
x = 3
s = int('27398876',22) + int('26351',22) + int('71135',22)
print(s // 21)276296118
Перебор всех 22 цифр подтвердил минимальное x = 3 и нулевой остаток суммы по модулю 21.
Где легко ошибиться. Ответ — частное, не найденная цифра x.
Сколько нулей в записи числа 3·3125⁸ + 2·625⁷ − 4·625⁶ + 3·125⁵ − 2·25⁴ − 2025 в системе счисления с основанием 25?
n = 3*3125**8 + 2*625**7 - 4*625**6 + 3*125**5 - 2*25**4 - 2025
zeros = 0
while n:
n, digit = divmod(n, 25)
zeros += digit == 0
print(zeros)10
Полученная последовательность цифр обратным вычислением в основании 25 восстанавливает исходное целое число.
Где легко ошибиться. Значения цифр 10–24 — по одному разряду, а не по две десятичные цифры.
Найти наибольшее натуральное x, не превышающее 2030, для которого запись 7¹⁷⁰ + 7¹⁰⁰ − x в системе счисления с основанием 7 содержит ровно 71 ноль.
for x in range(2030, 0, -1):
n = 7**170 + 7**100 - x
zeros = 0
while n:
n, digit = divmod(n, 7)
zeros += digit == 0
if zeros == 71:
print(x)
break2029
Для всех 2030 значений выполнен подсчёт цифр; максимум допустимых равен 2029.
Где легко ошибиться. Нельзя считать нули в десятичной строке числа.
Задание 15
B = [70;90]. Найти наибольшее натуральное A, при котором ДЕЛ(x,A) ∨ ((x ∈ B) → ¬ДЕЛ(x,22)) истинно при любом натуральном x. ДЕЛ(x,d) означает, что x делится на d.
88
При A = 88 опасное значение x = 88 покрывается первой частью, все остальные натуральные x — второй.
Где легко ошибиться. Проверка нескольких x сама по себе не доказывает утверждение «при любом x»; здесь все случаи сведены к единственному кратному.
К номерам заданий ↑Задание 16
F(n) = 1 при n ≤ 1, F(n) = n·F(n−1) при n > 1. Вычислить (F(3038) + 5F(3037)) / F(3036).
9241591
Прямое умножение 3037 · 3043 даёт 9 241 591.
Где легко ошибиться. Значение 5 умножается на всю F(3037), а не добавляется внутри рекурсии.
К номерам заданий ↑Задание 17
demo_17.txt содержит натуральные числа от 1 до 100 000. Найти количество соседних пар, у которых хотя бы один элемент при делении на 33 даёт остаток, равный минимальному элементу всей последовательности; затем максимальную сумму подходящей пары.
a = list(map(int, open('demo_17.txt').read().split()))
m = min(a)
sums = [x+y for x,y in zip(a,a[1:]) if x % 33 == m or y % 33 == m]
print(len(sums), max(sums))622; 174933
Выполнен расчёт по всем 9999 соседним парам официального файла.
Где легко ошибиться. Нужен минимум всего файла, а не меньший элемент текущей пары.
К номерам заданий ↑Задание 18
Поле demo_18.ods содержит монеты и стены. Робот начинает в левой верхней клетке, ходит только вправо или вниз, собирая монеты в каждой посещённой клетке, включая начальную и конечную. Маршрут заканчивается в любой клетке, откуда оба хода закрыты. Найти максимум и минимум итоговых сумм.
| Конечная клетка (строка;столбец) | Минимум | Максимум |
|---|---|---|
| (14;11) | 803 | 1774 |
| (14;19) | 1003 | 1620 |
| (20;17) | 1346 | 2598 |
| (20;20) | 1162 | 2553 |
2598; 803
Два расчёта — прямое динамическое программирование и рекурсивный поиск с запоминанием — совпали. Значения по четырём концам сверены с реальными границами ODS.
Где легко ошибиться. Путь может закончиться во внутреннем тупике; нельзя игнорировать стены или брать только клетку (20;20).
К номерам заданий ↑Задание 19
Две кучи: 17 и S камней, 1 ≤ S ≤ 115. Петя ходит первым. За ход можно добавить 4 камня в одну кучу или удвоить одну кучу. Побеждает сделавший сумму не менее 133. Найти минимальное S, при котором после неудачного первого хода Пети Ваня может выиграть своим первым ходом.
29
Перебор всех четырёх первых ходов и ответов для S = 1…115 подтвердил минимум 29.
Где легко ошибиться. В этом пункте написано «после неудачного хода», а не «при любой игре Пети».
К номерам заданий ↑Задание 20
Две кучи: 17 и S камней, 1 ≤ S ≤ 115. Петя ходит первым. За ход можно добавить 4 камня в одну кучу или удвоить одну кучу. Побеждает сделавший сумму не менее 133. Найти два наименьших S, при которых Петя не выигрывает сразу, но может гарантировать победу своим вторым ходом.
from functools import lru_cache
def moves(a,b):
return [(a+4,b),(a,b+4),(2*a,b),(a,2*b)]
@lru_cache(None)
def game(a,b):
if a+b >= 133:
return 0
values = [game(*p) for p in moves(a,b)]
wins = [v for v in values if v <= 0]
return 1-max(wins) if wins else -max(values)
print([s for s in range(1,116) if game(17,s) == 2][:2])28; 48
Полная таблица конечной игры рассчитана для всех допустимых S; первые позиции game = 2 — 28 и 48.
Где легко ошибиться. Для гарантии после выбранного хода Пети должны подходить все ответы Вани, а не один удачный.
К номерам заданий ↑Задание 21
Две кучи: 17 и S камней, 1 ≤ S ≤ 115. Петя ходит первым. За ход можно добавить 4 камня в одну кучу или удвоить одну кучу. Побеждает сделавший сумму не менее 133. Найти минимальное S, при котором Ваня гарантирует победу первым или вторым ходом, но не может гарантировать победу только первым ходом.
from functools import lru_cache
def moves(a,b):
return [(a+4,b),(a,b+4),(2*a,b),(a,2*b)]
@lru_cache(None)
def game(a,b):
if a+b >= 133:
return 0
values = [game(*p) for p in moves(a,b)]
wins = [v for v in values if v <= 0]
return 1-max(wins) if wins else -max(values)
print(min(s for s in range(1,116) if game(17,s) == -2))44
Проверены все S от 1 до 115; минимальная позиция с оценкой −2 — (17;44).
Где легко ошибиться. Нельзя заменять условие −2 на любую отрицательную оценку.
К номерам заданий ↑Задание 22
В demo_22.ods указаны ID процессов, длительность в миллисекундах и процессы-предшественники. Значение 0 означает отсутствие зависимостей. Каждый процесс начинается сразу после завершения всех предшественников. Сколько процессов выполняется в седьмую миллисекунду?
| ID | Старт | Завершение |
|---|---|---|
| 7 | 2 | 8 |
| 11 | 5 | 11 |
| 12 | 4 | 10 |
| 15 | 5 | 8 |
| 16 | 5 | 9 |
| 18 | 4 | 10 |
| 19 | 4 | 9 |
| 21 | 2 | 8 |
8
Получено расписание всех 25 процессов; восемь интервалов содержат момент 6.
Где легко ошибиться. Процесс, завершившийся в момент 6, уже не выполняется в седьмую миллисекунду.
К номерам заданий ↑Задание 23
Исполнитель начинает с числа 100. Команда A прибавляет 1. Команда B меняет местами две последние цифры, но разрешена только когда цифра десятков меньше цифры единиц. Сколько программ приводит к 141?
ways = {100: 1}
for n in range(100, 141):
ways[n+1] = ways.get(n+1,0) + ways.get(n,0)
t,u = n//10%10, n%10
if t < u:
m = n//100*100 + 10*u + t
if m <= 141:
ways[m] = ways.get(m,0) + ways.get(n,0)
print(ways[141])16
Прямой динамический подсчёт дал 16; строгое увеличение исключает циклы и повторную обработку состояния.
Где легко ошибиться. Одинаковые цифры переставлять нельзя; команды считаются разными путями, даже если потом приходят в одно число.
К номерам заданий ↑Задание 24
В demo_24.txt строка из цифр 0, 6, 7, 8, 9 и знаков «−», «*». Найти максимальную длину непрерывного фрагмента — правильного арифметического выражения с неотрицательными целыми операндами без ведущих нулей. Два знака подряд недопустимы.
import re
s = open('demo_24.txt').read().strip()
number = r'(?:0|[6789][06789]*)'
pattern = re.compile(number + r'(?:[-*]' + number + r')*')
print(max(len(m.group()) for m in pattern.finditer(s)))154
Регулярное выражение и независимый посимвольный конечный автомат дали 154; сохранён найденный фрагмент и его позиции 9094262…9094415 с нуля.
Где легко ошибиться. Число 0 допустимо, а 06 — нет. Нельзя просто разбить строку по повторяющимся знакам.
К номерам заданий ↑Задание 25 · 2 примера
Найти первые пять натуральных чисел, больших 1103285717, которые являются произведением двух простых множителей (они могут совпадать). В десятичной записи каждого множителя сочетание 16 встречается ровно один раз. Для каждого числа вывести само число и меньший множитель.
from math import isqrt
from bisect import bisect_left
lower=1103285717;upper=lower+1000000;limit=upper//163+1
sieve=bytearray(b'\1')*(limit+1);sieve[:2]=b'\0\0'
for p in range(2,isqrt(limit)+1):
if sieve[p]:sieve[p*p:limit+1:p]=b'\0'*((limit-p*p)//p+1)
primes=[p for p in range(2,limit+1) if sieve[p] and str(p).count('16')==1];assert primes[0]==163
candidates=[]
for p in primes:
if p*p>upper:break
start=bisect_left(primes,max(p,lower//p+1))
for q in primes[start:start+5]:
if p*q<=upper:candidates.append((p*q,p))
for row in sorted(set(candidates))[:5]:
print(*row)| Число | Меньший простой множитель |
|---|---|
| 1103299319 | 1693 |
| 1103309477 | 1693 |
| 1103322107 | 16187 |
| 1103323021 | 1693 |
| 1103328547 | 3169 |
1103299319 1693 1103309477 1693 1103322107 16187 1103323021 1693 1103328547 3169
Первые пять произведений получены решетом и сопоставлены с официальным ключом; оба множителя каждого — простые и имеют ровно одно «16».
Где легко ошибиться. «Произведение двух простых» исключает числа с тремя простыми множителями. Не требуйте, чтобы множители обязательно различались.
Маска 3?12?14*5: «?» заменяет ровно одну цифру, «*» — любую последовательность цифр, в том числе пустую. Найти все числа не более 10¹⁰, подходящие под маску и делящиеся на 1917. Вывести число и частное.
answers = []
for a in range(10):
for b in range(10):
for length in range(3):
for middle in range(10**length):
star = '' if length == 0 else str(middle).zfill(length)
n = int(f'3{a}12{b}14{star}5')
if n <= 10**10 and n % 1917 == 0:
answers.append((n,n//1917))
for row in sorted(answers):
print(*row)| Число | Частное при делении на 1917 |
|---|---|
| 351261495 | 183235 |
| 3212614035 | 1675855 |
| 3412614645 | 1780185 |
| 3712414275 | 1936575 |
| 3912414885 | 2040905 |
351261495 183235 3212614035 1675855 3412614645 1780185 3712414275 1936575 3912414885 2040905
Проверены все 11 100 строковых вариантов маски; найдены ровно пять кратных 1917.
Где легко ошибиться. Звёздочка допускает пустую строку, вопросительный знак — нет.
Задание 26
В demo_26.txt первая строка содержит N и вместимость памяти K. Далее N запросов: время ЧЧ:ММ:СС, ID клиента, объём в Кбайт. Когда новый запрос не помещается, создаётся копия накопленных данных, память очищается, затем записывается новый запрос. Найти ID клиента с максимальным суммарным объёмом за весь журнал и сумму двух крупнейших копий, созданных не позднее 11:59:59.
from collections import defaultdict
with open('demo_26.txt') as f:
n,k = map(int,f.readline().split())
rows = [(t,int(c),int(s)) for t,c,s in (line.split() for line in f)]
rows.sort(key=lambda r:r[0])
total = defaultdict(int)
used = 0
backups = []
for t,client,size in rows:
total[client] += size
if used + size > k:
if t <= '11:59:59':
backups.append(used)
used = 0
used += size
print(max(total,key=total.get), sum(sorted(backups,reverse=True)[:2]))7040; 52204
Обработаны все 15 001 запрос; до полудня создано 534 копии. Дополнительно проверена иллюстрация ФИПИ: 303; 220000.
Где легко ошибиться. Переполняющий запрос не входит в создаваемую перед ним копию. Не добавляйте финальную копию без события переполнения.
К номерам заданий ↑Задание 27
Каждая строка demo_27.txt: координаты x,y, компоненты скорости Vx,Vy, масса m, признак I–VII. Энергия E = m(Vx²+Vy²)/2. Частицы разбиваются единственным образом на четыре кластера, разность любых двух энергий в одном кластере не больше 2. Центр — частица с минимальной суммой абсолютных разностей энергий до остальных. Q1 — наибольшее евклидово расстояние между частицами признака II внутри одного кластера; Q2 — максимальная энергия центра. Записать целые части 10000Q1 и 10000Q2.
| Частиц | Минимальная E | Максимальная E | Энергия центра |
|---|---|---|---|
| 501 | 1.200504911 | 3.099446746 | 2.149929716 |
| 601 | 4.400790044 | 5.697651983 | 5.046474401 |
| 701 | 6.502298556 | 8.296279722 | 7.403865478 |
| 801 | 9.100270945 | 10.998806181 | 10.070467028 |
539936; 100704
Все 2604 частицы обработаны. Для каждого кластера отдельно проверена сумма модулей для каждой возможной частицы-центра: минимум единственный и совпадает с медианой. Расстояния перебраны по всем допустимым парам II.
Где легко ошибиться. Нельзя кластеризовать по x,y, брать геометрический центр или искать расстояние между частицами разных кластеров.
К номерам заданий ↑Основа — утверждённая демоверсия ФИПИ 2027, опубликованная в нашем разделе материалов 13 ноября 2026 года. Разбор подготовлен 14 ноября. Демоверсия показывает формат экзамена; условия настоящего экзамена будут другими. Ответы и критерии сверены с приложенным документом.
На бесплатном разборе вашей ситуации уточним цель и сложные темы. Можно заниматься онлайн из любого города. Подходящий формат и наличие занятий согласуем отдельно.
Свяжемся с вами, уточним задачу и обсудим следующий шаг. Запись не обязывает покупать занятия.
Спасибо! Свяжемся с вами, уточним задачу и согласуем удобный формат разговора. Если есть решённая работа, сохраните её для обсуждения.
Спросим о классе, предмете и цели. Если есть решённая работа, пригодятся ваши ответы.
Уточним подходящий формат и наличие занятий. Стоимость и расписание согласуем до записи.
После бесплатного разговора можно выбрать занятия или продолжить подготовку самостоятельно.