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

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

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

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

Задача 1#25621

Исполнитель ШКОЛКОВО преобразует число баллов ЕГЭ, записанное на экране. У исполнителя есть три команды, которым присвоены номера:

   1. Прибавь 1  ;

   2. Прибавь 5  ;

   3. Возведи в квадрат.

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

Программа для исполнителя ШКОЛКОВО это последовательность команд.

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

Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы 1321  при исходном числе 3  траектория будет состоять из чисел 4,16,21,22  .

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

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

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

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

- Если текущее число превышает finish, дальнейшее применение команд невозможно, возвращаем 0.

- В остальных случаях функция вызывает сама себя трижды: f(start+1, finish) (команда "прибавь 1"), f(start+5, finish) (команда "прибавь 5") и f(start*start, finish) (команда "возвести в квадрат"). Сумма этих трёх вызовов даёт общее количество программ для данного промежутка.

Поскольку траектория должна содержать число 5, решаем задачу по частям: сначала считаем количество программ от 2 до 5, затем от 5 до 26, и перемножаем результаты, так как каждый путь первой части может сочетаться с любым путём второй части.

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

# Считаем количество программ от 2 до 5 и от 5 до 26
# Перемножаем результаты для учета условия о траектории
print(f(2, 5) * f(5, 26))

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

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

1. Создаем массив a большого размера (например, 10000 элементов) и инициализируем его нулями.

2. В ячейку с индексом 2 записываем 1, так как мы начинаем с числа 2.

3. Перебираем все числа от 2 до 26 (целевое число включительно). На каждом шаге делаем следующее:

- Если текущее число равно 5 (обязательное число в траектории), обнуляем все будущие значения массива от 6 до 26, чтобы учесть требование, что 5 должна обязательно встретиться.

- Для каждого числа добавляем количество способов для текущего числа в ячейки i+1, i+5 и i*i, соответствующие действиям команд "прибавь 1 "прибавь 5"и "возвести в квадрат". Это позволяет аккумулировать все возможные траектории до каждого числа.

4. После завершения цикла в ячейке с индексом 26 хранится общее количество программ, которые начинаются с 2, проходят через 5 и заканчиваются на 26.

# Создаем массив для подсчета количества программ
a = [0] * 10000
# Исходное число 2 — один способ быть в этом состоянии
a[2] = 1

# Проходим по всем числам от 2 до 26
for i in range(2, 26):
    # Если текущее число равно обязательному числу 5
    if i == 5:
        # Обнуляем все будущие числа до 26,
        # чтобы учесть условие прохождения через 5
        for j in range(6, 27):
            a[j] = 0
    # Добавляем текущие способы в следующие числа согласно командам
    a[i + 1] += a[i]   # команда "прибавь 1"
    a[i + 5] += a[i]   # команда "прибавь 5"
    a[i * i] += a[i]   # команда "возвести в квадрат"

# Количество программ, удовлетворяющих условиям, хранится в a[26]
print(a[26])

Ответ: 372

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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