C/C++

Задача на Python

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

1. Прибавить 1

2. Умножить на 2

Первая команда увеличивает число на 1, вторая умножает его на 2. Программа для исполнителя – это последовательность команд. Сколько существует программ, для которых при исходном числе 1 результатом является число N, и при этом траектория вычислений содержит число M?

Входные данные: натуральные числа М и N, в одну строку через пробел, при этом 1 < M < N. Вывести количество возможных программ.

Sample Input:

10 20
Sample Output:

28
Динамическое программирование без всяких рекурсий и повторных вычислений одного и того же:
 m, n = map(int, input().split())
p = [0, 1]
p += (p[i - 1] + (p[i // 2], 0)[i % 2] for i in range(2, m + 1))
q = [p[m]]
q += (q[i - m - 1] + (q[max(i // 2 - m, 0)], 0)[i < m * 2 or (i - m) % 2] for i in range(m + 1, n + 1))
print(q[n - m])
Функциональный вариант:
 from functools import reduce
m, n = map(int, input().split())
pm = reduce(lambda a, i: a + [a[i - 1] + (a[i // 2], 0)[i % 2]], range(2, m + 1), [0, 1])[-1:]
pn = reduce(lambda a, i: a + [a[i - m - 1] + (a[max(i // 2 - m, 0)], 0)[i < m * 2 or (i - m) % 2]],
range(m + 1, n + 1), pm)[-1:]
print(*pn)
Sergej Fuss
Sergej Fuss
87 571
Лучший ответ
Алгоритм:

1. Рекурсивно перебираем все возможные программы, начиная с исходного числа 1 до тех пор, пока не получим число N.

2. В процессе перебора, каждый раз проверяем, содержит ли текущая траектория числа M. Если да, то увеличиваем счетчик количества программ.

3. Возвращаем счетчик.

Реализация на Python:

```python
def count_programs(m, n):
count = 0

def run_program(num, path):
if num == n:
nonlocal count
if m in path:
count += 1
return

# команда 1: прибавить 1
run_program(num + 1, path + [num])

# команда 2: умножить на 2
run_program(num * 2, path + [num])

run_program(1, [])
return count
```

Примеры:

```python
>>> count_programs(10, 20)
28
>>> count_programs(1, 100)
1553
```
Cергей Яковенко Не работает