Тема 23. Оператор присваивания и ветвления

23.05 Количество программ из A в B смешанное

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела оператор присваивания и ветвления
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#64073

Исполнитель преобразует число на экране. У исполнителя есть три команды:

1. Вычти 1

2. Вычти 3

3. Найди целую часть от деления на 4

Первая из них уменьшает число на экране на 1, вторая уменьшает число на экране на 3, третья заменяет число на экране на целую часть от деления числа на 4.

Сколько существует программ, для которых при исходном числе 38 результатом является число 11, и при этом траектория вычислений содержит число 24, но не содержит числа 22?

Показать ответ и решение

Рекурсия:

Определим функцию f(a, b), которая будет вызывать саму себя. Она подсчитает количество программ, преобразующих число a в b. Функция возвращает:

  • 0, если a < b или если в процессе встречается запрещённое число 22, так как такая траектория точно не будет подходящей и ее не нужно учитывать в подсчете количества траекторий;
  • 1, если a == b, так как единица означает, что мы нашли путь, который число А может превратить в число B выполнив все условия задачи;
  • сумму значений для трёх возможных переходов (вычитание 1, вычитание 3, целая часть от деления на 4), если a > b, так как такая траектория еще не нарушила условия задачи и может стать подходящей.

Так как нужно, чтобы траектория содержала число 24, но не содержала число 22, то общее количество программ равно произведению f(38, 24) и f(24,11). Первая часть считает количество способов дойти от 38 до 24, вторая — от 24 до 11, произведение этих значений дает ответ, так как для каждого пути из первой части можно использовать любой путь из второй части.

# Функция для подсчета количества программ преобразования a -> b
def f(a, b):
    # Если число меньше целевого или равно запрещённому 22,
    # то есть нарушено условие задачи
    if a < b or a == 22:
        return 0
    # Если дошли до целевого числа,
    # то есть получили подходящую траекторию
    if a == b:
        return 1
    # В остальных случаяй, считаем все возможные переходы
    return f(a - 1, b) + f(a - 3, b) + f(a // 4, b)
# Вычисляем и выводим ответ, учитывая условие
# траектория проходит через 24
print(f(38,24) * f(24,11))

Ответ: 6063

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение

Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты

Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей

Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!