Исполнитель преобразует натуральные числа. У исполнителя есть две команды, которым присвоены номера:
1. Прибавить 1
2. Умножить на 2
Первая команда увеличивает число на 1, вторая умножает его на 2. Программа для исполнителя – это последовательность команд. Сколько существует программ, для которых при исходном числе 1 результатом является число N, и при этом траектория вычислений содержит число M?
Входные данные: натуральные числа М и N, в одну строку через пробел, при этом 1 < M < N. Вывести количество возможных программ.
Sample Input:
10 20
Sample Output:
28
C/C++
Задача на Python
Динамическое программирование без всяких рекурсий и повторных вычислений одного и того же:
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)
Алгоритм:
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
```
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ергей Яковенко
Не работает
Похожие вопросы
- Задача по программированию. Решить на Python или C++
- Что лучше для новичка: Python vs C?
- Что стоит учить Python или C++.
- В какую сферу IT идти учиться? Есть пять вариантов : 1) Программирование С++(либо python); ...
- Зарплаты разработчиков C++ Python
- Какой язык программирования работает быстрее и в каких случаях (Python и C++)?
- Решите задачу на любом языке. Желательно на с++.
- Задачу написать на с++ , она не сложная но почему то не получается напишите задачу с помощью цикла
- Решите задачу на с++, или хотя бы скажите идею как это вообще решать пожалуйста.
- Решите задачу на любом языке, или хотя бы скажите идею как это вообще решать пожалуйста.