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

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

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

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

Задача 1#56324

Исполнитель преобразует число, записанное на экране.

У исполнителя есть команды, которым присвоены номера:

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

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

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

Первая команда увеличивает число на экране на 1  , вторая — на 4  , третья — увеличивает число в 2  раза. Программа для исполнителя — это последовательность команд.

Сколько существует программ, для которых при исходном числе 4  результатом является число 27  и при этом траектория содержит число 22  ? Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы 123  при исходном числе 1  траектория будет состоять из чисел     2  , 6  , 12  .

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

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

Мы решаем задачу рекурсивным методом. Сначала определяем функцию f(x, y), которая подсчитывает количество программ, преобразующих число x  в число y  .

1. Проверяем, достигли ли мы цели: если x == y  , значит путь завершён успешно, возвращаем 1  .

2. Проверяем условие выхода за пределы: если x > y  , дальнейшие операции приведут к числу больше цели, возвращаем 0  .

3. Если ни одно из условий не выполнено, рекурсивно вызываем функцию для всех трёх возможных команд:

- прибавление 1 (x + 1),

- прибавление 4 (x + 4),

- умножение на 2 (x * 2),

и суммируем результаты этих вызовов.

Так как траектория должна содержать число 22, мы разбиваем задачу на два этапа: подсчёт программ от 4 до 22 и от 22 до 27. Итоговое количество программ равно произведению результатов этих двух этапов, так как каждый путь до 22 может сочетаться с любым путём от 22 до 27.

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

# Считаем количество программ от 4 до 22 и от 22 до 27, перемножаем результаты
print(f(4, 22) * f(22, 27))

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

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

1. Инициализируем массив нулями и ставим a[4] = 1, так как начинаем с числа 4, и существует один способ находиться на нём.

2. Перебираем числа от 5 до 27 включительно. Для каждого числа i  :

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

- добавляем количество программ, ведущих из i− 4  , для команды "прибавить 4

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

3. Когда мы достигаем числа 22, обнуляем все предыдущие ячейки, так как траектория должна обязательно пройти через 22, и пути, которые не достигают 22, не считаются.

После завершения цикла, значение a[27] содержит количество программ, удовлетворяющих условию.

# Создаем массив длиной 28, заполняем нулями
a = [0] * 28
# Начальное положение: только один способ быть в числе 4
a[4] = 1
# Перебираем числа от 5 до 27 включительно
for i in range(5, 28):
    # Суммируем количество программ, ведущих из i-1 и i-4
    # Для i четного добавляем путь из i//2
    a[i] = a[i - 1] + a[i - 4] + a[i // 2] * (i % 2 == 0)
    # Если достигли числа 22, обнуляем все предыдущие значения
    # чтобы учесть обязательное прохождение через 22
    if i == 22:
        for j in range(i):
            a[j] = 0

# Выводим количество программ, приводящих к числу 27 через 22
print(a[27])

Ответ: 933

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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