Задание 23 ЕГЭ по информатике: решайте с автопроверкой
В задании 23 у исполнителя две или три команды, например «прибавить 1» и «умножить на 2». Нужно посчитать программы, которые переводят одно число в другое, иногда с условием: траектория проходит через одни числа и обходит другие.
Решать задачи номераКак решать программой
Количество программ из a в b считает рекурсивная функция: если a больше b, программ нет; если a равно b, программа одна (пустая); иначе сложите количества программ после каждой команды.
Обязательное число c делит путь на два отрезка: число программ равно произведению количеств из a в c и из c в b. Запрещённое число просто даёт ноль, если траектория в него попала.
Для больших чисел добавьте @lru_cache или посчитайте количества циклом от a к b в списке. Для команд из примера (+1, +2, ×2) cnt[x] прибавляется к cnt[x + 1], cnt[x + 2] и cnt[2x].
Проверьте функцию на маленьком отрезке, где программы легко выписать руками. Например, с командами из примера из 3 в 5 ведут две программы: «1, 1» и «2».
Разбор примера
Команды: прибавить 1, прибавить 2, умножить на 2. Сколько программ переводят 3 в 25 через 10 и не проходят через 17?
def count(a, b, avoid):
if a > b or a in avoid:
return 0
if a == b:
return 1
return (count(a + 1, b, avoid) + count(a + 2, b, avoid)
+ count(a * 2, b, avoid))
print(count(3, 10, {17}) * count(10, 25, {17}))Программа печатает
8580
Из 3 в 10 ведут 30 программ, из 10 в 25 в обход 17 ведут 286 программ. Каждую первую часть можно продолжить любой второй, поэтому всего 30 · 286 = 8580 программ.
Решить эту задачуЗадачи к заданию 23
- Три команды и обязательные числаСредняяРешать
- Хотя бы одна отметка на траекторииСредняяРешать
- Обратный отсчёт с делением пополамСредняяРешать
- Прибавить или возвести в квадратСредняяРешать
- Прибавить последнюю цифруСредняяРешать
- Сколько разных результатов у программСредняяРешать
- Без двух одинаковых команд подрядСредняяРешать
- Не больше m умножений в программеСредняяРешать
- Траектория без кратных dСредняяРешать
- Ровно одно отмеченное числоСредняяРешать
Бесплатно и без регистрации: пишете код в браузере и проверяете его тестами (без аккаунта — несколько задач в день).
Вопросы и ответы
- Почему перемножают, а не складывают?
- Каждую программу до обязательного числа можно продолжить любой программой после него. Пары считаются произведением.
- Что если команда уменьшает число?
- Тогда условие a > b уже не останавливает перебор. Ограничьте траекторию по смыслу задачи или считайте динамикой.
- Входит ли исходное число в траекторию?
- Обычно нет: траектория — это результаты команд. Проверьте определение в условии.