Как решать задание 23 ЕГЭ по информатике (число программ, пути)?
Задание 23 про исполнителя с командами +1 и *2: надо найти количество программ, переводящих число A в число B, иногда с обязательным прохождением через точку. Как считать число таких программ на ЕГЭ?
2 ответа
Задание 23 — подсчёт количества программ исполнителя (команды вроде «прибавь 1», «умножь на 2»), переводящих число A в B. Иногда: с обязательным прохождением через промежуточное число C.
Метод — динамическое программирование «снизу вверх». Пусть K(n) — число программ из A в n. Тогда в n можно попасть из тех чисел, откуда есть ход в n:
- из n−1 (командой +1),
- из n/2 (командой ×2, если n чётное).
K(n) = K(n-1) + K(n/2 если n чётно), при этом K(A) = 1.
A, B = 3, 100
K = {A: 1}
for n in range(A+1, B+1):
K[n] = K.get(n-1, 0)
if n % 2 == 0:
K[n] += K.get(n//2, 0)
print(K[B])
С промежуточной точкой C (программа обязана пройти через C): по правилу умножения
ответ = (число программ A→C) × (число программ C→B).
Считаешь два раза одной и той же функцией.
Частые ошибки:
- учитывать ×2 для нечётных n (нельзя: из дробного не придёшь);
- неверная база (K(A) = 1, а не 0);
- при условии «через C» забыть перемножить два участка, а не сложить.
Есть запрещённые числа? Просто ставь K = 0 для них — пути через них занулятся.
Опорная идея — считать количество способов попасть в каждое число по порядку от A до B. В каждое n приходишь из n−1 (всегда) и из n/2 (только если n чётное). Складываешь эти количества — получаешь K(n).
Если в задаче есть «запрещённые» числа, которые нельзя посещать, просто исключай их (количество способов в них = 0), и пути сквозь них автоматически не посчитаются. Через обязательную точку — перемножение двух участков.