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

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

Задача 1#84023

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

1. Увеличь на 1

2. Умножь на 2

Программа для исполнителя – это последовательность команд.

Сколько существует программ, для которых при исходном числе 5 результатом является число 299, если известно, что никакую команду нельзя выполнять более трёх раз подряд?

Показать ответ и решение
# c1 - количество совершенных команд 1
# с2 - количество совершенных команд 2
def f(a, b, c1=0, c2=0):
    if a > b:
        return 0
    if a == b:
        return 1

    s = 0
    if c1 < 3:
        s += f(a + 1, b, c1 + 1, 0)
    if c2 < 3:
        s += f(a * 2, b, 0, c2 + 1)
    return s


print(f(5, 299))

Ответ: 26

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

Задача 2#84021

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

1. Увеличь на 1

2. Увеличь на 3

3. Умножь на 4

Программа для исполнителя – это последовательность команд.

Сколько существует программ, для которых при исходном числе 1 результатом является число 824, при этом траектория вычислений содержит числa 21 и 68, причём можно использовать только ту команду, чей номер отличается на 1 от номера команды, выполненной на предыдущем шаге?

Показать ответ и решение
# c - номер команды на предыдущем шаге
# r1 - флаг наличия в траектории 21
# r2 - флаг наличия в траектории 68
def f(a, b, c=0, r1=False, r2=False):
    if a > b:
        return 0
    if a == b and r1 and r2:
        return 1
    if a == 21:
        r1 = True
    if a == 68:
        r2 = True

    if c == 1 or c == 3:
        return f(a + 3, b, 2, r1, r2)
    if c == 2:
        return f(a + 1, b, 1, r1, r2) + f(a * 4, b, 3, r1, r2)
    return f(a + 1, b, 1, r1, r2) + f(a + 3, b, 2, r1, r2) + f(a * 4, b, 3, r1, r2)

print(f(1, 824))

Ответ: 36

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

Задача 3#84019

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

1. Увеличь на 4

2. Умножь на 2

3. Умножь на 3

Программа для исполнителя – это последовательность команд.

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

Показать ответ и решение
# c - номер команды на предыдущем шаге
# r - флаг наличия в траектории 6
def f(a, b, c=0, r=False):
    if a > b or a == 18:
        return 0
    if a == b and r:
        return 1
    if a == 6:
        r = True

    s = f(a * 2, b, 2, r)
    if c != 1:
        s += f(a * 3, b, 3, r)
    if c != 2:
        s += f(a + 4, b, 1, r)
    return s


print(f(2, 296))

Ответ: 48

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

Задача 4#84013

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

1. Увеличь на разряд единиц

2. Увеличь на разряд десятков

3. Умножь на разряд единиц

4. Умножь на разряд десятков

5. Прибавь 1

Первая и третья команды используют значение разряда единиц числа (например у 13 это 3, а у 28 - 8), а вторая и четвертая команды используют значение разряда десятков числа (например у 81 это 8, а у 35 это 3). Причём не разрешается выполнять команду, если после неё число на экране не изменится, либо превратится в 0. Программа для исполнителя – это последовательность команд.

Сколько существует программ, для которых при исходном числе 25 результатом является число 111, если известно, что нельзя повторять команду, сделанную два шага назад (например программа 112 допустима, а 121 - нет)?

Показать ответ и решение
from functools import lru_cache


# c1 - номер команды на предыдущем шаге
# с2 - номер команды на ПРЕДпредыдущем шаге
@lru_cache(None)
def f(a, b, c1=0, c2=0):
    if a > b:
        return 0
    if a == b:
        return 1
    s = 0
    x = a % 10  # Число единиц
    y = a // 10 % 10  # Число десятков

    if c2 != 1 and x != 0:
        s += f(a + x, b, 1, c1)

    if c2 != 2 and y != 0:
        s += f(a + y, b, 2, c1)

    if c2 != 3 and x != 0 and x != 1:
        s += f(a * x, b, 3, c1)

    if c2 != 4 and y != 0 and y != 1:
        s += f(a * y, b, 4, c1)

    if c2 != 5:
        s += f(a + 1, b, 5, c1)

    return s


print(f(25, 111))

Ответ: 3548990

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

Задача 5#84011

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

1. Прибавь 8

2. Умножь на 3

3. Увеличь на разряд единиц

Первая из них увеличивает число на экране на 8, вторая увеличивает число на экране в 3 раза, третья увеличивает число на экране на значение разряда единиц (например число 12 увеличится на 2, а число 25 на 5). Программа для исполнителя – это последовательность команд.

Сколько существует программ, для которых при исходном числе 4 результатом является число 174, если известно, что нельзя повторять команду, сделанную на предыдущем шаге.

Показать ответ и решение
# c - номер команды на предыдущем шаге
def f(a, b, c=0):
    if a > b:
        return 0
    if a == b:
        return 1
    s = 0
    if c != 1:
        s += f(a + 8, b, 1)
    if c != 2:
        s += f(a * 3, b, 2)
    if c != 3:
        s += f(a + (a % 10), b, 3)
    return s

print(f(4, 174))

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