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

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

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

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

Задача 1#24745

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

  1. Прибавить 3  ;
  2. Умножить на 2  .

Первая команда увеличивает число на экране на 3  , вторая увеличивает его в 2  раза. Сколько существует программ, для которых при исходном числе 12  результатом будет число 96  , обязательно проходящее через число 30  .

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

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

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

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

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

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

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

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

# Вычисляем и выводим общее количество программ,
# проходящих через число 30
print(f(12, 30) * f(30, 96))

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

Идея динамического подхода состоит в том, чтобы создать массив a, где индекс соответствует числу, а значение по индексу — количество способов добраться до этого числа из числа 12.

1. Создаём массив длиной 97, изначально заполненный нулями, и записываем в ячейку с индексом 12 значение 1, так как стартуем с числа 12.

2. Проходим циклом по всем числам от 15 до 96 включительно. Для каждого числа i  :

- прибавляем значение из ячейки i− 3  , так как к i  можно прийти командой «прибавить 3»;

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

3. После того как мы дошли до числа 30, обнуляем все значения до 30, так как траектория должна обязательно проходить через 30, и предыдущие пути нельзя учитывать.

4. После заполнения массива, значение в ячейке с индексом 96 будет равно количеству программ, удовлетворяющих условию задачи.

# Создаем массив длиной 97, все элементы изначально равны 0
a = [0]*97
# В ячейку с индексом 12 записываем 1, так как стартуем с числа 12
a[12] = 1
# Перебираем числа от 15 до 96 включительно
for i in range(15, 97):
    # Количество способов добраться до i увеличиваем на:
    # a[i-3] - путь командой "прибавить 3"
    # a[i//2] * (i % 2 == 0) - путь командой "умножить на 2", только если i четное
    a[i] += a[i-3] + a[i//2] * (i % 2 == 0)
    # Если достигли числа 30, обнуляем все предыдущие значения,
    # так как траектория должна обязательно проходить через 30
    if i == 30:
        for j in range(30):
            a[j] = 0

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

Ответ: 24

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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