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

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

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

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

Задача 1#16524

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

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

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

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

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

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

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

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

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

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

- Если текущее число x  совпадает с целевым y  , возвращаем 1, так как найден корректный путь.

- Если x  больше y  , возвращаем 0, так как дальнейшие операции не могут привести к уменьшению числа.

- В остальных случаях функция рекурсивно вызывает сама себя для трёх вариантов команд: x+ 3  , x + 4  и x ∗2  , суммируя результаты этих вызовов, чтобы получить общее количество программ.

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

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

# Вычисляем общее количество программ через число 22
print(f(3, 22) * f(22, 35))

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

Динамический способ решения заключается в построении массива a, где индекс i  соответствует числу на экране, а значение a[i] — количество программ, которые преобразуют исходное число в число i  .

1. Инициализируем массив нулями и задаём a[3] = 1, так как начинаем с числа 3.

2. Перебираем все числа от 3 до 22 включительно. Для каждого числа i  прибавляем количество программ к числам i+ 3  , i+ 4  и i∗ 2  , чтобы учесть все возможные команды. Таким образом, в массиве к моменту достижения числа 22 будут корректно подсчитаны все пути из 3 в 22.

- После этого необходимо обнулить все значения в массиве, кроме a[22]. Это делается потому, что траектория должна содержать число 22: все пути, которые не достигли числа 22, не удовлетворяют условию, и их нельзя учитывать на следующем этапе.

3. Далее перебираем числа от 22 до 35 включительно, применяя те же команды. На этом этапе a[i] учитывает только пути, которые начинаются из числа 22, гарантируя, что траектория обязательно проходит через него.

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

# Создаем массив из 1000 элементов, все значения изначально 0
a = [0] * 1000
# Начальное число 3, существует ровно один способ быть в этом положении
a[3] = 1

# Первый этап: от 3 до 22
for i in range(3, 22 + 1):
    # Для каждого числа добавляем количество программ к числам,
    # которые получаются применением каждой команды
    a[i + 3] += a[i]
    a[i + 4] += a[i]
    a[i * 2] += a[i]

# Обнуляем все числа, кроме 22, чтобы следующие этапы учитывали только траектории,
# проходящие через 22
for i in range(1000):
    if i != 22:
        a[i] = 0

# Второй этап: от 22 до 35
for i in range(22, 35 + 1):
    # Применяем все три команды и суммируем количество программ
    a[i + 3] += a[i]
    a[i + 4] += a[i]
    a[i * 2] += a[i]

# Выводим итоговое количество программ
print(a[35])

Ответ: 108

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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