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

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

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

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

Задача 1#60488

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

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

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

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

Программа для исполнителя Банан – это последовательность команд. Сколько существует программ, для которых при исходном числе 7 результатом является число 77, и при этом траектория вычислений содержит число 31?

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

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

Мы используем рекурсивный способ, в котором строим функцию f(n, m), подсчитывающую количество программ, преобразующих число n в число m.

1. Сначала мы проверяем условие окончания пути:

- Если n == m, значит мы достигли цели, и существует один корректный путь. Возвращаем 1.

- Если n > m, путь невозможен (число превысило цель), возвращаем 0.

2. Если ни одно из условий не выполнено, мы выполняем рекурсивные вызовы для каждой команды:

- f(n + 2, m) — соответствует команде "прибавить 2".

- f(n + 5, m) — соответствует команде "прибавить 5".

- f(n * 3, m) — соответствует команде "умножить на 3".

3. Чтобы учитывать условие, что траектория содержит число 31, мы делим вычисление на два этапа:

- Сначала считаем все пути от 7 до 31: f(7, 31).

- Затем считаем пути от 31 до 77: f(31, 77).

- Произведение этих двух значений даёт общее количество программ, так как для каждого пути до 31 можно использовать любой путь из 31 до 77.

# Определяем рекурсивную функцию f(n, m)
def f(n, m):
    # Если текущее число равно цели, найден один путь
    if n == m:
        return 1
    # Если текущее число больше цели, путь невозможен
    if n > m:
        return 0
    # В остальных случаях суммируем количество программ для всех трех команд
    return f(n + 2, m) + f(n + 5, m) + f(n * 3, m)

# Считаем пути до числа 31, затем от 31 до 77, перемножаем результаты
print(f(7, 31) * f(31, 77))

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

Мы используем динамический массив a длиной 78, где каждый элемент a[i] хранит количество программ, приводящих к числу i.

1. Инициализируем массив нулями: a = [0] * 78.

2. Устанавливаем начальное число 7: a[7] = 1, так как существует ровно один способ находиться в числе 7 без выполнения команд.

3. Проходим по всем числам от 8 до 77:

- Для каждого i прибавляем количество способов добраться из i-2, i-5.

- Если i делится на 3, добавляем количество способов из i//3.

- После достижения числа 31 обнуляем все предыдущие значения массива (a[j] = 0 для всех j < 31), чтобы обеспечить прохождение траектории через 31.

4. В конце количество программ, которые приводят к числу 77 через 31, хранится в a[77].

# Создаем массив для хранения количества программ
a = [0] * 78
# Начальное число 7 имеет один путь
a[7] = 1
# Перебираем все числа от 8 до 77
for i in range(8, 78):
    # Суммируем количество способов из предыдущих чисел
    a[i] = a[i - 2] + a[i - 5] + a[i // 3] * (i % 3 == 0)
    # Если достигли числа 31, обнуляем все предыдущие значения
    if i == 31:
        for j in range(i):
            a[j] = 0
# Выводим количество программ, которые ведут от 7 к 77 через 31
print(a[77])

Ответ: 315645

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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