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

23.04 Количество программ из A в B где траектория вычислений НЕ содержит число(-а)

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

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

Задача 1#72479

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

1. Прибавить 1

2. Прибавить 2

3. Умножить на 3

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

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

Решение рекурсией

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

1. Если текущее число a  больше целевого числа b  или равно запрещённому числу 12, то путь невозможен и возвращаем 0.

2. Если текущее число a  совпадает с b  , значит мы нашли корректную программу и возвращаем 1.

3. В противном случае считаем все возможные переходы: прибавляем 1, прибавляем 2 или умножаем на 3, вызывая функцию рекурсивно для каждого из вариантов и суммируя результаты.

Таким образом, каждая рекурсивная ветка проверяет корректность траектории и суммирует количество программ для всех допустимых вариантов. Вызов f(3,40) даст итоговое количество программ, которые из числа 3 приводят к числу 40, обходя число 12.

# Импортируем кэш для ускорения рекурсии
from functools import lru_cache

# Применяем кэширование для функции f
@lru_cache(None)
def f(a, b):
    # Если текущее число больше целевого или равно запрещённому 12
    # путь невозможен, возвращаем 0
    if a > b or a == 12:
        return 0
    # Если текущее число совпало с целевым числом
    # найден корректный путь, возвращаем 1
    if a == b:
        return 1
    # В остальных случаях считаем все возможные переходы:
    # прибавить 1, прибавить 2, умножить на 3
    return f(a + 1, b) + f(a + 2, b) + f(a * 3, b)

# Вызываем функцию от 3 до 40 и выводим результат
print(f(3,40))

Решение динамикой

Мы используем динамический способ, создавая массив a длиной 41, где индекс соответствует числу на экране, а значение по индексу показывает количество программ, ведущих к этому числу. Изначально заполняем массив нулями, а в ячейку с индексом 3 записываем 1, так как начинаем с числа 3.

Далее для каждого числа i  от 4 до 40 включительно выполняем следующие действия:

- Считаем количество программ, которые приходят к i  из i− 1  командой "прибавить 1".

- Считаем количество программ, которые приходят к i  из i− 2  командой "прибавить 2".

- Если i  делится на 3, считаем количество программ, которые приходят к i  из i∕∕3  командой "умножить на 3".

- Если i  равно 12, принудительно обнуляем количество программ, так как число 12 запрещено в траектории.

После прохода по всем индексам в массиве, итоговое количество программ хранится в a[40].

# Создаем массив из 41 элемента, все значения равны 0
a = [0] * 41
# В ячейку с индексом 3 записываем 1, так как стартуем с числа 3
a[3] = 1
# Перебираем все числа от 4 до 40
for i in range(4, 41):
    # Считаем количество программ из i-1, i-2 и i//3
    a[i] = a[i - 1] + a[i - 2] + a[i // 3] * (i % 3 == 0)
    # Если число равно 12, обнуляем количество программ
    a[12] = 0

# Выводим количество программ, которые ведут от 3 к 40 без числа 12
print(a[40])

Ответ: 11824582

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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