Исполнитель преобразует число на экране. У исполнителя есть две команды, которым присвоены номера:
- Прибавить
;
- Сделай нечётное.
Выполняя первую команду, исполнитель увеличивает число на , а выполняя вторую — из числа
получает число
.
Сколько существует программ, для которых при исходном числе результатом является число
и при этом траектория вычислений не содержит число
?
Решение 1 (Рекурсия)
def f(s, fi):
if s > fi:
return 0
if s == 21:
return 0
if s == fi:
return 1
return f(s + 1, fi) + f(s * 2 + 1, fi)
print(f(1, 25))
Решение 2 (Динамика)
a = [0] * 26
a[1] = 1
for i in range(2, 26):
a[i] += a[i - 1]
if i % 2 != 0:
a[i] += a[i // 2]
if i == 21:
a[i] = 0
print(a[25])