Тип 23 № 58224 
Оператор присваивания и ветвления. Перебор вариантов, построение дерева. Количество программ с обязательным и избегаемым этапами
i
Исполнитель Увеличитель преобразует число на экране.
У исполнителя есть две команды, которым присвоены номера.
1. Вычти 1.
2. Найди целую часть от деления на 2.
Первая из них уменьшает число на экране на 1, вторая заменяет число на экране на целую часть от деления числа на 2.
Программа для исполнителя — это последовательность команд.
При исходном числе 45 результатом является число 3 и при этом траектория вычислений содержит число 15 и не содержит 5. Сколько таких программ существует?
Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы 122 при исходном числе 10 траектория состоит из чисел 9, 4, 2.
Решение. Пусть R(n) — количество программ, которые число 45 преобразуют в число n. Будем учитывать то, что траектория вычислений должна содержать число 15 и не содержать число 5.
Траекторию вычисления получения числа 3 из числа 45, содержащую число 15 до числа 23 можно получить только одним способом, последовательно вычитая 1, то:
R(45) = R(44) = R(43) = ... =R(23) = 1.
Числа от 22 до 15 можно получить двумя способами, вычитанием 1 и целочисленным делением на 2:
R(22) = R(23) + R(45) + R(44) = 3;
R(21) = R(22) + R(43) + R(42) = 5;
R(20) = R(21) + R(41) + R(40) = 7;
R(19) = R(20) + R(39) + R(38) = 9;
R(18) = R(19) + R(37) + R(36) = 11;
R(17) = R(18) + R(35) + R(34) = 13;
R(16) = R(17) + R(33) + R(32) = 15;
R(15) = R(16) + R(31) + R(30) = 17.
Числа с 15 до 8 можно получить только одним способом, вычитанием 1, так как остальные программы не будут проходить через число 15:
R(15) = R(14) = R(13) = ... =R(8) = 17;
R(7) = R(8) + R(15) + R(14) = 51;
R(6) = R(7) + R(13) + R(12) = 85;
R(4) = R(7) + R(8) = 34;
R(3) = R(4) + R(7) + R(6) = 170.
Таким образом, количество программ, удовлетворяющих условию задачи, равно 170.
Ответ: 170.
Приведём другое решение на языке Python.
def f(x, y):
if x < y or x == 5:
return 0
if x == y:
return 1
else:
return f(x - 1, y) + f(x // 2, y)
print(f(45, 15) * f(15, 3))
Ответ: 170