23.04 Количество программ из A в B где траектория вычислений НЕ содержит число(-а)
Готовиться с нами - ЛЕГКО!
Ошибка.
Попробуйте повторить позже
У исполнителя КРАБИК три команды, которым присвоены номера:
1. прибавь 1
2. прибавь 5
3. умножь на 2
Первая из них увеличивает на 1 число на экране, вторая увеличивает это число на 5, третья - увеличивает это число в 2 раза.
Программа для КРАБИКА — это последовательность команд. Сколько существует программ, которые число 2 преобразуют в число 16, но не проходят через число 10?
Решение рекурсией
Определим функцию f(a, b), которая будет вызывать саму себя. Она подсчитает количество программ, преобразующих число a в b. Функция возвращает:
- 0, если a > b, так как такая траектория точно не будет подходящей и ее не нужно учитывать в подсчете количества траекторий;
- 1, если a == b, так как единица означает, что мы нашли путь, который число А может превратить в число B выполнив все условия задачи;
- сумму значений для трёх возможных переходов (+1, умножить на 2, +5), если a < b, так как такая траектория еще не нарушила условия задачи и может стать подходящей.
# Функция для подсчета количества программ преобразования a -> b def f(x, y): if x == y: # Если дошли до нужного числа return 1 if x > y or x == 10: # Если число стало больше нужного или встретили 10 return 0 return f(x + 1, y) + f(x + 5, y) + f(2 * x , y) # Количество путей до текущего числа print(f(2, 16)) # Найдем ответ по условию задачи
Решение динамикой
Динамический способ решения заключается в подсчете количества траекторий для каждого числа опираясь на подсчеты для предыдущих значений. Так, например, для подсчета количества траекторий до числа 8 необходимо знать количество траекторий до числа 5, 6 и 7.
Для реализации этого способа в программе создадим список, изначально заполненный нулями. Каждое число в списке будет обозначать количество траекторий до определенного числа. Далее пройдем по списку и заполним его значениями. Значение для каждой i-ой ячейки равно сумме значений для ячеек с индексами i - 1, i - 5 и i // 2.
# Создаем массив для хранения количества путей до чисел от 3 до 16 # a[i] - количество программ, которые преобразуют число 2 в число i a = [0] * 17 a[2] = 1 # Начальное число for i in range(3, 17): a[i] = a[i - 1] + a[i - 5] + a[i // 2] * (i % 2 == 0) # Будем делить на 2 только если число кратно 2 a[10] = 0 # Пропускаем число 10 print(a[16]) # Выводим ответ
Ошибка.
Попробуйте повторить позже
Исполнитель Пирожок преобразует число, записанное на экране.
У исполнителя есть команды, которым присвоены номера:
- Прибавить
- Прибавить
- Умножить на
Первая команда увеличивает число на экране на , вторая — на
, третья — удваивает число.
Программа для исполнителя Пирожок — это последовательность команд.
Сколько существует программ, для которых при исходном числе результатом является число
и при этом траектория вычислений не содержит числа
и
? Траектория вычислений
программы – это последовательность результатов выполнения всех команд программы. Например,
для программы
при исходном числе
траектория будет состоять из чисел
,
,
.
Решение динамикой
Динамический способ решения заключается в подсчете количества траекторий для каждого числа опираясь на подсчеты для предыдущих значений. Так, например, для подсчета количества траекторий до числа 8 необходимо знать количество траекторий до числа 5, 6 и 7.
Для реализации этого способа в программе создадим список, изначально заполненный нулями. Каждое число в списке будет обозначать количество траекторий до определенного числа. Далее пройдем по списку и заполним его значениями. Значение для каждой i-ой ячейки равно сумме значений для ячеек с индексами i - 3, i - 4 и i // 2.
# Создаем массив для хранения количества путей до чисел от 257 до 273 # a[i] - количество программ, которые преобразуют число 256 в число i a = [0] * 274 a[256] = 1 # Начальное число for i in range(257, 274): a[i] = a[i - 3] + a[i - 4] + a[i // 2] * (i % 2 == 0) # Будем делить на 2 только если число кратно 2 if i == 262 or i == 270: # Если встретили запрещённые числа - ставим 0, чтобы их не учитывать a[i] = 0 print(a[273]) # Выводим ответ
Решение руками
Пусть — количество программ, которое число 1 преобразует в число
. Тогда верно
следующее утверждение:
Заметим, что — это больше числа, которое нам нужно найти, значит 3-я команда нам
не понадобится. Составим уравнение:
Составим таблицу по данному уравнению:
Так как траектория не должна содержать число 262, то . Продолжим заполнение
таблицы:
Аналогично .
Отсюда ответ — 2.
Ошибка.
Попробуйте повторить позже
Исполнитель Семенова преобразует число, записанное на экране.
У исполнителя есть команды, которым присвоены номера:
1. Прибавить 1,
2. умножить на 2,
3. умножить на 3.
Первая команда увеличивает число на экране на 1, вторая — удваивает число, третья — утраивает число. Программа для исполнителя Семенова — это последовательность команд.
Сколько существует программ, для которых при исходном числе 1 результатом является число 38 и при этом траектория вычислений не содержит числа 9 , 24 и 32? Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы 121 при исходном числе 7 траектория будет состоять из чисел 8, 16, 17.
Пусть — количество программ, которое число 1 преобразует в число
. Тогда верно следующее
утверждение:
— если число не делится ни на 2, ни на 3.
— если число делится на 2, но не делится на 3.
— если число делится на 3, но не делится на 2.
— если число делится на 2 и на 3.
Заполним таблицу по данным формулам до 8:
Так как по условию сказано, что траектория не должна содержать число 9, значит .
Продолжим заполнять таблицу:
Аналогично . Продолжим заполнять таблицу:
Аналогично . Заполним таблицу до конца:
Отсюда получем ответ — 195
Решение рекурсией
Определим функцию f(a, b), которая будет вызывать саму себя. Она подсчитает количество программ, преобразующих число a в b. Функция возвращает:
- 0, если a > b, так как такая траектория точно не будет подходящей и ее не нужно учитывать в подсчете количества траекторий;
- 1, если a == b, так как единица означает, что мы нашли путь, который число А может превратить в число B выполнив все условия задачи;
- сумму значений для трёх возможных переходов (+1, умножить на 2, умножить на 3), если a < b, так как такая траектория еще не нарушила условия задачи и может стать подходящей.
#Функция для подсчета количества программ преобразования a -> b def f(c,m): if c > m or c == 9 or c == 24 or c == 32: # Если число стало больше нужного или встретились запрещённые return 0 if c == m: # Если дошли до нужного числа return 1 return f(c * 2, m) + f(c + 1, m) + f(c * 3, m) # Количество путей до текущего числа print(f(1,38)) # Найдем ответ по условию задачи
Ошибка.
Попробуйте повторить позже
Исполнитель САЛФЕТОЧКА преобразует число на экране.
У исполнителя есть две команды, которым присвоены номера:
1. Прибавить 1,
2. Прибавить 2.
Первая команда увеличивает число на экране на 1, вторая увеличивает его на 2. Программа для исполнителя САЛФЕТОЧКА — это последовательность команд.
Сколько существует программ, для которых при исходном числе 1 результатом является число 14 и при этом траектория вычислений не содержит число 8? Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы 121 при исходном числе 7 траектория будет состоять из чисел 8, 10, 11.
Пусть — количество программ, которые число 1 преобразуют в число
. Тогда верно следующее
утверждение:
Заполним таблицу по данной формуле до 7:
Так как по условию сказано, что траектория не должна проходить через число 8, значит мы никак не
можем его получить, что означает .
Заполним таблицу до конца:
Осюда получаем ответ — 104.
Решение рекурсией
Определим функцию f(a, b), которая будет вызывать саму себя. Она подсчитает количество программ, преобразующих число a в b. Функция возвращает:
- 0, если a > b, так как такая траектория точно не будет подходящей и ее не нужно учитывать в подсчете количества траекторий;
- 1, если a == b, так как единица означает, что мы нашли путь, который число А может превратить в число B выполнив все условия задачи;
- сумму значений для трёх возможных переходов (+1, +2), если a < b, так как такая траектория еще не нарушила условия задачи и может стать подходящей.
# Функция для подсчета количества программ преобразования a -> b def f(c, m): if c > m or c == 8: # Если число стало больше нужного или встретили запрещённое return 0 if c == m: # Если дошли до нужного числа return 1 return f(c + 2, m)+f(c + 1, m) # Количество путей до текущего числа print(f(1, 14)) # Найдем ответ по условию задачи
Ошибка.
Попробуйте повторить позже
Исполнитель Крабомёт преобразует число на экране.
У исполнителя есть две команды, которым присвоены номера:
- Прибавить
- Умножить на
Первая команда увеличивает число на экране на , вторая увеличивает его в
раза. Программа
для исполнителя Программист — это последовательность команд.
Сколько существует программ, для которых при исходном числе результатом является число
и при этом траектория вычислений не содержит число
? Траектория вычислений
программы — это последовательность результатов выполнения всех команд программы. Например,
для программы
при исходном числе
траектория будет состоять из чисел
,
,
.
Решение динамикой
Динамический способ решения заключается в подсчете количества траекторий для каждого числа опираясь на подсчеты для предыдущих значений. Так, например, для подсчета количества траекторий до числа 8 необходимо знать количество траекторий до числа 5, 6 и 7.
Для реализации этого способа в программе создадим список, изначально заполненный нулями. Каждое число в списке будет обозначать количество траекторий до определенного числа. Далее пройдем по списку и заполним его значениями. Значение для каждой i-ой ячейки равно сумме значений для ячеек с индексами i - 1 и i // 2.
a = [0] * 20 a[1] = 1 # Начальное число for i in range(2, 20): a[i] = a[i - 1] + a[i // 2] * (i % 2 == 0) # Будем делить на 2 только если число кратно 2 if i == 14: # Если встретили нужное число - обнулим всё до него, таким образом будут учтены пути лишь с учётом 14 a[i] = 0 print(a[19]) # Выводим ответ
Решение динамикой 2
# Повторим шаги с первого решения динамикой, но теперь будем заполнять значения наперёд # Создаем массив для хранения количества путей до чисел до 40 # a[i] - количество программ, которые преобразуют число 1 в число i a = [0] * 40 a[1] = 1 for i in range(1, 19): if i == 14: # Если встретили нужное число - обнулим всё до него, таким образом будут учтены пути лишь с учётом 14 a[i] = 0 a[i + 1] += a[i] a[i * 2] += a[i] print(a[19]) # Выводим ответ
Решение 3 Пусть — количество программ, которые число 1 преобразуют в число
. Тогда
верно следующее утверждение:
Заполним таблицу по данной формуле до 13:
Так как по условию сказано, что траектория не должна проходить через число 14, значит мы никак
не можем его получить, что означает .
Заполним таблицу до конца:
Отсюда получаем ответ — 20.
Ошибка.
Попробуйте повторить позже
Исполнитель ЭВМ преобразует число, записанное на экране.
У исполнителя есть команды , которым присвоены номера:
1. Прибавить 1,
2. Прибавить 3,
3. Умножить на 2.
Первая команда увеличивает число на экране на 1, вторая — на 3, третья — удваивает число на экране. Программа для исполнителя ЭВМ — это последовательность команд.
Сколько существует программ, для которых при исходном числе 1 результатом является число 27 и при этом траектория вычислений не содержит числа 16 и 23? Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы 121 при исходном числе 7 траектория будет состоять из чисел 8, 11, 12.
Пусть — количество программ, которые число 1 преобразуют в число
. Тогда верно следующее
утверждение:
— если число не делится на 2.
— если число делится на 2.
Заполним таблицу по данной формуле до 15:
Так как по условию сказано, что траектория не должна проходить через число 16, значит мы никак
не можем его получить, что означает .
Продолжим заполнять таблицу:
Аналогично .
Заполним таблицу до конца:
Отсюда получаем ответ — 7247.
Решение рекурсией
Определим функцию f(a, b), которая будет вызывать саму себя. Она подсчитает количество программ, преобразующих число a в b. Функция возвращает:
- 0, если a > b, так как такая траектория точно не будет подходящей и ее не нужно учитывать в подсчете количества траекторий;
- 1, если a == b, так как единица означает, что мы нашли путь, который число А может превратить в число B выполнив все условия задачи;
- сумму значений для трёх возможных переходов (+1, умножить на 2, +3), если a < b, так как такая траектория еще не нарушила условия задачи и может стать подходящей.
# Функция для подсчета количества программ преобразования a -> b def f(c, m): if c > m or c == 16 or c == 23: # Если число стало больше нужного или встретили запрещённое return 0 if c == m: # Если дошли до нужного числа return 1 return f(c + 1, m) + f(c + 3, m) + f(c * 2, m) # Количество путей до текущего числа print(f(1, 27)) # Найдем ответ по условию задачи
Ошибка.
Попробуйте повторить позже
Исполнитель преобразует число, записанное на экране.
У исполнителя есть команды, которым присвоены номера:
1. Прибавить 2,
2. Прибавить 3,
3. Прибавить 5.
Первая команда увеличивает число на экране на 2, вторая — на 3, третья — на 5. Программа для исполнителя — это последовательность команд.
Сколько существует программ, для которых при исходном числе 1 результатом является число 25 и при этом траектория вычислений не содержит числа 13 и 19? Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы 121 при исходном числе 7 траектория будет состоять из чисел 9, 12, 14.
Пусть — количество программ, которое число 1 преобразует в число
. Тогда верно следующее
утверждение:
Заполним таблицу по данной формуле до 12:
Так как по условию сказано, что траектория не должна содержать число 13, значит .
Продолжим заполнять таблицу:
Аналогично . Заполним таблицу до конца:
Отсюда получаем ответ — 796.
Решение рекурсией
Определим функцию f(a, b), которая будет вызывать саму себя. Она подсчитает количество программ, преобразующих число a в b. Функция возвращает:
- 0, если a > b, так как такая траектория точно не будет подходящей и ее не нужно учитывать в подсчете количества траекторий;
- 1, если a == b, так как единица означает, что мы нашли путь, который число А может превратить в число B выполнив все условия задачи;
- сумму значений для трёх возможных переходов (+2, +5, +3), если a < b, так как такая траектория еще не нарушила условия задачи и может стать подходящей.
# Функция для подсчета количества программ преобразования a -> b def f(c, m): if c > m or c == 13 or c == 19: # Если число стало больше нужного или встретили запрещённое return 0 if c == m: # Если дошли до нужного числа return 1 return f(c + 2, m) + f(c + 3, m) + f(c + 5, m) # Количество путей до текущего числа print(f(1, 25)) # Найдем ответ по условию задачи
Ошибка.
Попробуйте повторить позже
Исполнитель преобразует число, записанное на экране.
У исполнителя есть команды, которым присвоены номера:
1. Прибавить 1
2. Прибавить 3
3. Умножить на 2
4. Умножить на 3
Первая команда увеличивает число, записанное на экране, на 1, вторая — на 3, третья — удваивает число на экране, четвертая — утраивает число на экране. Программа для исполнителя— это последовательность команд.
Сколько существует программ, для которых при исходном числе 3 результатом является число 45 и при этом траектория вычисления не содержит числа 5, 17 и 35? Траектория вычислений программы – это последовательность результатов выполнения всех команд программы. Например, для программы 1314 при исходном числе 7 траектория будет состоять из чисел 8, 16, 17, 51.
Пусть — количество программ, которое число 1 преобразует в число
. Тогда верно следующее
утверждение:
— если число не делится ни на 2, ни на 3.
— если число делится на 2, но не делится на 3.
— если число делится на 3, но не делится на 2.
— если число делится и на 2, и на 3.
Сразу заметим, что по условию задачи траектория не должна содержать числа 5, 17 и 35. Значит
,
и
.
Составим таблицу по данным формулам:
Получаем ответ – 1278967.
Решение рекурсией
Определим функцию f(a, b), которая будет вызывать саму себя. Она подсчитает количество программ, преобразующих число a в b. Функция возвращает:
- 0, если a > b, так как такая траектория точно не будет подходящей и ее не нужно учитывать в подсчете количества траекторий;
- 1, если a == b, так как единица означает, что мы нашли путь, который число А может превратить в число B выполнив все условия задачи;
- сумму значений для трёх возможных переходов (+1, умножить на 2, +3, умножить на 3), если a < b, так как такая траектория еще не нарушила условия задачи и может стать подходящей.
# Функция для подсчета количества программ преобразования a -> b def f(c, m): if c > m or c == 5 or c == 17 or c == 35: # Если число стало больше нужного или встретилось запрещённое return 0 if c == m: # Если дошли до нужного числа return 1 return f(c + 1, m) + f(c + 3, m) + f(c * 2, m) + f(c * 3, m) # Количество путей до текущего числа print(f(3, 45)) # Найдем ответ по условию задачи
Ошибка.
Попробуйте повторить позже
Исполнитель ГО преобразует число на экране. У исполнителя ГО две команды, которым присвоены номера:
. Прибавить
. Сделать нечётное
Первая из этих команд увеличивает число на экране на
, вторая переводит число
в число
. Например,
вторая команда переводит число
в число
. Программа для исполнителя ГО – это последовательность
команд.
Сколько существует таких программ, которые число преобразуют в число
, причём траектория вычислений не
содержит число
?
Траектория вычислений программы – это последовательность результатов выполнения всех команд программы.
Решение рекурсией
Определим функцию f(a, b), которая будет вызывать саму себя. Она подсчитает количество программ, преобразующих число a в b. Функция возвращает:
- 0, если a > b, так как такая траектория точно не будет подходящей и ее не нужно учитывать в подсчете количества траекторий;
- 1, если a == b, так как единица означает, что мы нашли путь, который число А может превратить в число B выполнив все условия задачи;
- сумму значений для трёх возможных переходов (+1, умножить на 2 + 1), если a < b, так как такая траектория еще не нарушила условия задачи и может стать подходящей.
# Функция для подсчета количества программ преобразования a -> b def f(x, y): if x > y or x == 26: # Если число стало больше нужного или встретилось запрещённое return 0 elif x == y: # Если дошли до нужного числа return 1 else: return f(x + 1, y) + f(x * 2 + 1, y) # Количество путей до текущего числа print(f(1, 27)) # Найдем ответ по условию задачи
Решение динамикой
Динамический способ решения заключается в подсчете количества траекторий для каждого числа опираясь на подсчеты для предыдущих значений. Так, например, для подсчета количества траекторий до числа 8 необходимо знать количество траекторий до числа 5, 6 и 7.
Для реализации этого способа в программе создадим список, изначально заполненный нулями. Каждое число в списке будет обозначать количество траекторий до определенного числа. Далее пройдем по списку и заполним его значениями. Значение для каждой i-ой ячейки равно сумме значений для ячеек с индексами i - 1 и i // 2 - 1.
# Создаем массив для хранения количества путей до чисел от 2 до 27 # a[i] - количество программ, которые преобразуют число 1 в число i a = [0] * 28 a[1] = 1 # Начальное число for i in range(2, 28): a[i] = a[i - 1] if i % 2 == 1: # Будем делить на 2 только если число даёт остаток 1, то есть результат по сути делить на 2 - 1 (деление целочисленное) a[i] += a[i // 2] if i == 26: # Выводим ответ a[i] = 0 print(a[27]) # Выводим ответ
Ошибка.
Попробуйте повторить позже
Исполнитель ЗВЕЗДОЧКА преобразует число, записанное на экране.
У исполнителя есть команды, которым присвоены номера:
1. Прибавить
2. Прибавить
3. Умножить на
Первая команда увеличивает число на экране на , вторая — на
, третья — увеличивает число в
раза.
Сколько существует программ, для которых при исходном числе результатом является число
и при этом
траектория не содержит число
?
Траектория вычислений программы — это последовательность результатов выполнения всех команд
программы. Например, для программы при исходном числе
траектория будет состоять из чисел
.
Решение рекурсией
Определим функцию f(a, b), которая будет вызывать саму себя. Она подсчитает количество программ, преобразующих число a в b. Функция возвращает:
- 0, если a > b, так как такая траектория точно не будет подходящей и ее не нужно учитывать в подсчете количества траекторий;
- 1, если a == b, так как единица означает, что мы нашли путь, который число А может превратить в число B выполнив все условия задачи;
- сумму значений для трёх возможных переходов (+1, умножить на 2, +4), если a < b, так как такая траектория еще не нарушила условия задачи и может стать подходящей.
# Функция для подсчета количества программ преобразования a -> b def f(x, y): if x > y or x == 30: # Если число стало больше нужного или встретили запрещённое return 0 elif x == y: # Если дошли до нужного числа return 1 else: return f(x + 1, y) + f(x + 4, y) + f(x * 2, y) # Количество путей до текущего числа print(f(33, 72)) # Найдем ответ по условию задачи
Решение динамикой
Динамический способ решения заключается в подсчете количества траекторий для каждого числа опираясь на подсчеты для предыдущих значений. Так, например, для подсчета количества траекторий до числа 8 необходимо знать количество траекторий до числа 5, 6 и 7.
Для реализации этого способа в программе создадим список, изначально заполненный нулями. Каждое число в списке будет обозначать количество траекторий до определенного числа. Далее пройдем по списку и заполним его значениями. Значение для каждой i-ой ячейки равно сумме значений для ячеек с индексами i - 1, i - 4 и i // 2.
# Создаем массив для хранения количества путей до чисел от 34 до 72 # a[i] - количество программ, которые преобразуют число 33 в число i num = [0] * 73 num[33] = 1 # Начальное число for i in range(34, 73): num[i] = ((num[i - 1] + num[i - 4]) + num[i // 2] * (i % 2 == 0)) * (i != 30) # Будем делить на 2 только если число кратно 2 и не равно 30 print(num[72]) # Выводим ответ
Ошибка.
Попробуйте повторить позже
Исполнитель КУРАТОР преобразует число, записанное на экране.
У исполнителя есть команды, которым присвоены номера:
1. Прибавить 1,
2. Прибавить 4,
3. Умножить на 2
Первая команда увеличивает число на экране на 1, вторая на 4, третья
увеличивает число в 2
раза.
Сколько существует программ, для которых при исходном числе 33 результатом является число 72 и при этом траектория не содержит число 56?
Траектория вычислений программы это последовательность результатов выполнения всех команд
программы. Например, для программы 123 при исходном числе 1 траектория будет состоять из чисел 2, 6,
12.
Решение рекурсией
Определим функцию f(a, b), которая будет вызывать саму себя. Она подсчитает количество программ, преобразующих число a в b. Функция возвращает:
- 0, если a > b, так как такая траектория точно не будет подходящей и ее не нужно учитывать в подсчете количества траекторий;
- 1, если a == b, так как единица означает, что мы нашли путь, который число А может превратить в число B выполнив все условия задачи;
- сумму значений для трёх возможных переходов (+1, умножить на 2, +4), если a < b, так как такая траектория еще не нарушила условия задачи и может стать подходящей.
# Функция для подсчета количества программ преобразования a -> b def f(x, y): if x > y or x == 56: # Если число стало больше нужного или встретилось запрещённое return 0 elif x == y: # Если дошли до нужного числа return 1 else: return f(x + 1, y) + f(x + 4, y) + f(x * 2, y) # Количество путей до текущего числа print(f(33, 72)) # Найдем ответ по условию задачи
Решение динамикой
Динамический способ решения заключается в подсчете количества траекторий для каждого числа опираясь на подсчеты для предыдущих значений. Так, например, для подсчета количества траекторий до числа 8 необходимо знать количество траекторий до числа 5, 6 и 7.
Для реализации этого способа в программе создадим список, изначально заполненный нулями. Каждое число в списке будет обозначать количество траекторий до определенного числа. Далее пройдем по списку и заполним его значениями. Значение для каждой i-ой ячейки равно сумме значений для ячеек с индексами i - 1, i - 4 и i // 2.
# Создаем массив для хранения количества путей до чисел от 33 до 72 # a[i] - количество программ, которые преобразуют число 33 в число i a = [0] * 10000 a[33] = 1 # Начальное число for i in range(33, 73): a[56] = 0 # Пропустим число 56 # Увеличиваем количество путей в следующих ячейках, если в них можно попасть из текущей a[i + 1] += a[i] a[i + 4] += a[i] a[i * 2] += a[i] print(a[72]) # Выводим ответ
Ошибка.
Попробуйте повторить позже
Исполнитель преобразует число на экране. У исполнителя есть две команды, которым присвоены номера:
- Прибавить
;
- Сделай нечётное.
Выполняя первую команду, исполнитель увеличивает число на , а выполняя вторую — из числа
получает число
.
Сколько существует программ, для которых при исходном числе результатом является число
и при этом
траектория вычислений не содержит число
?
Решение рекурсией
Определим функцию f(a, b), которая будет вызывать саму себя. Она подсчитает количество программ, преобразующих число a в b. Функция возвращает:
- 0, если a > b, так как такая траектория точно не будет подходящей и ее не нужно учитывать в подсчете количества траекторий;
- 1, если a == b, так как единица означает, что мы нашли путь, который число А может превратить в число B выполнив все условия задачи;
- сумму значений для трёх возможных переходов (+1, умножить на 2 + 1), если a < b, так как такая траектория еще не нарушила условия задачи и может стать подходящей.
# Функция для подсчета количества программ преобразования a -> b def f(s, fi): if s > fi: # Если число стало больше нужного return 0 if s == 21: # Если встретили 21 return 0 # Пропустим его, вписав 0 if s == fi: # Если дошли до нужного числа return 1 return f(s + 1, fi) + f(s * 2 + 1, fi) # Количество путей до текущего числа print(f(1, 25)) # Найдем ответ по условию задачи
Решение динамикой
Динамический способ решения заключается в подсчете количества траекторий для каждого числа опираясь на подсчеты для предыдущих значений. Так, например, для подсчета количества траекторий до числа 8 необходимо знать количество траекторий до числа 5, 6 и 7.
Для реализации этого способа в программе создадим список, изначально заполненный нулями. Каждое число в списке будет обозначать количество траекторий до определенного числа. Далее пройдем по списку и заполним его значениями. Значение для каждой i-ой ячейки равно сумме значений для ячеек с индексами i - 1 и i // 2.
# Создаем массив для хранения количества путей до чисел от 2 до 25 # a[i] - количество программ, которые преобразуют число 1 в число i a = [0] * 26 a[1] = 1 # Начальное число for i in range(2, 26): a[i] += a[i - 1] if i % 2 != 0: # Будем делить на 2 только если число кратно 2 a[i] += a[i // 2] if i == 21: # Если встретили 21 a[i] = 0 # Пропустим его, вписав 0 print(a[25]) # Выводим ответ
Ошибка.
Попробуйте повторить позже
Исполнитель ЭМИ преобразует число, записанное на экране. У исполнителя есть команды, которым присвоены номера:
- Прибавить
;
- Прибавить
;
- Умножить на
;
- Умножить на
.
Первая команда увеличивает число, записанное на экране, на , вторая — на
, третья — удваивает число на экране,
четвертая — утраивает число на экране. Программа для исполнителя ЭМИ — это последовательность команд. Сколько
существует программ, для которых при исходном числе
результатом является число
и при этом траектория
вычисления не содержит числа
и
?
Траектория вычислений программы – это последовательность результатов выполнения всех команд
программы. Например, для программы при исходном числе
траектория будет состоять из чисел
.
Решение рекурсией
Определим функцию f(a, b), которая будет вызывать саму себя. Она подсчитает количество программ, преобразующих число a в b. Функция возвращает:
- 0, если a > b, так как такая траектория точно не будет подходящей и ее не нужно учитывать в подсчете количества траекторий;
- 1, если a == b, так как единица означает, что мы нашли путь, который число А может превратить в число B выполнив все условия задачи;
- сумму значений для трёх возможных переходов (+1, умножить на 2, +3, умножить на 3), если a < b, так как такая траектория еще не нарушила условия задачи и может стать подходящей.
# Функция для подсчета количества программ преобразования a -> b def f(x, y): if x > y or x == 5 or x == 17 or x == 35: # Если число стало больше нужного или встретили запрещённое return 0 elif x == y: # Если дошли до нужного числа return 1 else: return f(x + 1, y) + f(x + 3, y) + f(x * 2, y) + f(x * 3, y) # Количество путей до текущего числа print(f(3, 45)) # Найдем ответ по условию задачи
Решение динамикой
Динамический способ решения заключается в подсчете количества траекторий для каждого числа опираясь на подсчеты для предыдущих значений. Так, например, для подсчета количества траекторий до числа 8 необходимо знать количество траекторий до числа 5, 6 и 7.
Для реализации этого способа в программе создадим список, изначально заполненный нулями. Каждое число в списке будет обозначать количество траекторий до определенного числа. Далее пройдем по списку и заполним его значениями. Значение для каждой i-ой ячейки равно сумме значений для ячеек с индексами i - 1, i - 3, i // 2, i // 3.
# Создаем массив для хранения количества путей до чисел от 4 до 45 # a[i] - количество программ, которые преобразуют число 3 в число i a = [0]*46 a[3] = 1 # Начальное число for i in range(4, 46): a[i] = a[i - 1] + a[i - 3] if i % 2 == 0: # Будем делить на 2 только если число кратно 2 a[i] += a[i // 2] if i % 3 == 0: # Будем делить на 3 только если число кратно 3 a[i] += a[i // 3] if i == 5 or i == 17 or i == 35: # Если встретили запрещённое число - пропускаем (ставим 0) a[i] = 0 print(a[45]) # Выводим ответ
Ошибка.
Попробуйте повторить позже
Исполнитель Кукушка преобразует число на экране. У исполнителя есть три команды, которым присвоены номера:
1. Прибавить 1
2. Прибавить 2
3. Умножить на 2
Программа для исполнителя Кукушка – это последовательность команд. Сколько существует программ, для которых при исходном числе 3 результатом является число 13 и при этом траектория вычислений не содержит число 8?
Решение рекурсией
Определим функцию f(a, b), которая будет вызывать саму себя. Она подсчитает количество программ, преобразующих число a в b. Функция возвращает:
- 0, если a > b, так как такая траектория точно не будет подходящей и ее не нужно учитывать в подсчете количества траекторий;
- 1, если a == b, так как единица означает, что мы нашли путь, который число А может превратить в число B выполнив все условия задачи;
- сумму значений для трёх возможных переходов (+1, умножить на 2, +2), если a < b, так как такая траектория еще не нарушила условия задачи и может стать подходящей.
# Функция для подсчета количества программ преобразования a -> b def f(start, finish): if start == finish: # Если дошли до нужного числа return 1 if start > finish or start == 8: # Если число стало больше нужного или 8 return 0 return f(start + 1, finish) + f(start + 2, finish) + f(start * 2, finish) # Количество путей до текущего числа print(f(3, 13)) # Найдем ответ по условию задачи
Решение динамикой
Динамический способ решения заключается в подсчете количества траекторий для каждого числа опираясь на подсчеты для предыдущих значений. Так, например, для подсчета количества траекторий до числа 8 необходимо знать количество траекторий до числа 5, 6 и 7.
Для реализации этого способа в программе создадим список, изначально заполненный нулями. Каждое число в списке будет обозначать количество траекторий до определенного числа. Далее пройдем по списку и заполним его значениями. Значение для каждой i-ой ячейки равно сумме значений для ячеек с индексами i - 1, i - 2 и i // 2.
# Создаем массив для хранения количества путей до чисел от 4 до 13 # a[i] - количество программ, которые преобразуют число 3 в число i a = [0] * 14 a[3] = 1 # Начальное число for i in range(4, 14): if i == 8: # Пропустим число 8 continue a[i] += a[i - 1] a[i] += a[i - 2] if i % 2 == 0: # Будем делить на 2 только если число кратно 2 a[i] += a[i // 2] print(a[13]) # Выводим ответ
Ошибка.
Попробуйте повторить позже
Исполнитель Калькулятор преобразует число на экране.
У исполнителя есть три команды, которым присвоены номера:
1. Прибавить 1
2. Умножить на 2
3. Прибавить 3
Первая команда увеличивает число на экране на 1, вторая умножает его на 2, третья увеличивает на 3.
Программа для исполнителя Калькулятор — это последовательность команд.
Сколько существует программ, которые преобразуют исходное число 2 в число 20 и при этом траектория вычислений не содержит чисел 7 и 15?
Траектория вычислений — это последовательность результатов выполнения всех команд программы. Например, для программы 312 при исходном числе 6 траектория будет состоять из чисел 9, 10, 20.
Решение рекурсией
Определим функцию f(a, b), которая будет вызывать саму себя. Она подсчитает количество программ, преобразующих число a в b. Функция возвращает:
- 0, если a > b, так как такая траектория точно не будет подходящей и ее не нужно учитывать в подсчете количества траекторий;
- 1, если a == b, так как единица означает, что мы нашли путь, который число А может превратить в число B выполнив все условия задачи;
- сумму значений для трёх возможных переходов (+1, умножить на 2, +3), если a < b, так как такая траектория еще не нарушила условия задачи и может стать подходящей.
# Функция для подсчета количества программ преобразования a -> b def f(a, b): if a == b: # Если дошли до нужного числа return 1 if a > b or a == 7 or a == 15: # Если число стало больше нужного или попалось 7 или 15 return 0 return f(a + 1, b) + f(a * 2, b) + f(a + 3, b) # Количество путей до текущего числа print(f(2, 20)) # Найдем ответ по условию задачи
Решение динамикой
Динамический способ решения заключается в подсчете количества траекторий для каждого числа опираясь на подсчеты для предыдущих значений. Так, например, для подсчета количества траекторий до числа 8 необходимо знать количество траекторий до числа 5, 6 и 7.
Для реализации этого способа в программе создадим список, изначально заполненный нулями. Каждое число в списке будет обозначать количество траекторий до определенного числа. Далее пройдем по списку и заполним его значениями. Значение для каждой i-ой ячейки равно сумме значений для ячеек с индексами i - 1, i - 3 и i // 2.
# Создаем массив для хранения количества путей до чисел от 3 до 20 # a[i] - количество программ, которые преобразуют число 2 в число i a = [0] * 21 a[2] = 1 # Начальное число for i in range(3, 21): if i == 7 or i == 15: # Пропустим 7 и 15 continue # Добавим в текущую ячейку пути из предыдущих if i % 2 == 0: # Будем делить на 2 только если число кратно 2 a[i] += a[i // 2] a[i] += a[i - 3] a[i] += a[i - 1] print(a[20]) # Выводим ответ
Ошибка.
Попробуйте повторить позже
Исполнитель Щелчок преобразует число на экране. У исполнителя есть три команды:
- Прибавить
- Умножить на
- Прибавить остаток от деления на
и прибавить
Программа для исполнителя — это последовательность команд.
Сколько существует программ, для которых при исходном числe результатом является число
, при этом
траектория вычислений не содержит числа
.
Траектория вычислений — это последовательность результатов выполнения всех команд программы. Например, для
программы при исходном числе
траектория будет состоять из чисел
,
,
.
Ошибка.
Попробуйте повторить позже
Исполнитель КЛУБНИЧКА преобразует число на экране. У исполнителя есть две команды:
1. Вычесть ;
2. Поделить на нацело.
Программа для исполнителя — это последовательность команд.
Сколько существует программ, для которых при исходном числe результатом является число
, при этом
траектория вычислений не содержит число
.
Траектория вычислений — это последовательность результатов выполнения всех команд программы. Например, для
программы при исходном числе
траектория будет состоять из чисел
.
Решение рекурсией
Определим функцию f(a, b), которая будет вызывать саму себя. Она подсчитает количество программ, преобразующих число a в b. Функция возвращает:
- 0, если a < b, так как такая траектория точно не будет подходящей и ее не нужно учитывать в подсчете количества траекторий;
- 1, если a == b, так как единица означает, что мы нашли путь, который число А может превратить в число B выполнив все условия задачи;
- сумму значений для трёх возможных переходов (-1, // 3), если a > b, так как такая траектория еще не нарушила условия задачи и может стать подходящей.
# Функция для подсчета количества программ преобразования a -> b def f(x, y): if x < y or x == 8: # Если число стало меньше нужного или попалась 8 return 0 elif x == y: # Если дошли до нужного числа return 1 else: return f(x - 1, y) + f(x // 3, y) # Количество путей до текущего числа print(f(43, 1)) # Найдем ответ по условию задачи
Решение динамикой
Динамический способ решения заключается в подсчете количества траекторий для каждого числа опираясь на подсчеты для предыдущих значений. Так, например, для подсчета количества траекторий до числа 8 необходимо знать количество траекторий до числа 5, 6 и 7.
Для реализации этого способа в программе создадим список, изначально заполненный нулями. Каждое число в списке будет обозначать количество траекторий до определенного числа. Далее пройдем по списку и заполним его значениями. Значение для каждой i-ой ячейки равно сумме значений для ячеек с индексами i + 1, i * 3, i * 3 + 1, i * 3 + 2.
# Создаем массив для хранения количества путей до чисел от 42 до 0 # a[i] - количество программ, которые преобразуют число 43 в число i a = [0] * (43 * 3 + 3) a[43] = 1 # Начальное число for i in range(42, 0, -1): # Количество путей до текущего числа. Учтем, что целочисленное деление сработает и для чисел * 3 + 1 и * 3 + 2. a[i] = a[i + 1] + a[i * 3] + a[i * 3 + 1] + a[i * 3 + 2] if i == 8: # Если встретили 8 - исключаем её (ставим 0 путей) a[i] = 0 print(a[1]) # Выводим ответ
Ошибка.
Попробуйте повторить позже
Исполнитель Филин преобразует число на экране.
У исполнителя есть две команды, которым присвоены номера:
1. Прибавить 1
2. Умножить на 2
Первая команда увеличивает число на экране на 1, вторая увеличивает его в 2 раза. Программа для исполнителя Филина — это последовательность команд.
Сколько существует программ, для которых при исходном числе 1 результатом является число 30, и при этом траектория вычислений не содержит число 8?
Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы 121 при исходном числе 1 траектория будет состоять из чисел 2, 4, 5.
Решение рекурсией
Определим функцию f(a, b), которая будет вызывать саму себя. Она подсчитает количество программ, преобразующих число a в b. Функция возвращает:
- 0, если a > b, так как такая траектория точно не будет подходящей и ее не нужно учитывать в подсчете количества траекторий;
- 1, если a == b, так как единица означает, что мы нашли путь, который число А может превратить в число B выполнив все условия задачи;
- сумму значений для трёх возможных переходов (+1, умножить на 2), если a < b, так как такая траектория еще не нарушила условия задачи и может стать подходящей.
# Функция для подсчета количества программ преобразования a -> b def f(a, b): if a > b or a == 8: # Если число стало больше нужного или 8 return 0 if a == b: # Если дошли до нужного числа return 1 if a < b: return f(a + 1, b) + f(a * 2, b) # Количество путей до текущего числа print(f(1, 30)) # Найдем ответ по условию задачи
Решение динамикой
Динамический способ решения заключается в подсчете количества траекторий для каждого числа опираясь на подсчеты для предыдущих значений. Так, например, для подсчета количества траекторий до числа 8 необходимо знать количество траекторий до числа 5, 6 и 7.
Для реализации этого способа в программе создадим список, изначально заполненный нулями. Каждое число в списке будет обозначать количество траекторий до определенного числа. Далее пройдем по списку и заполним его значениями. Значение для каждой i-ой ячейки равно сумме значений для ячеек с индексами i - 1, i // 2.
# Создаем массив для хранения количества путей до чисел от 2 до 30 # a[i] - количество программ, которые преобразуют число 1 в число i a = [0] * 31 a[1] = 1 # Начальное число for i in range(2, 31): a[i] = a[i - 1] + a[i // 2] * (i % 2 == 0) # Будем делить на 2 только если число кратно 2 a[8] = 0 # Пропускаем 8 print(a[30]) # Выводим ответ
Ошибка.
Попробуйте повторить позже
Исполнитель КтоТут преобразует число на экране. У исполнителя есть две команды, которым присвоены номера:
1. Прибавить 3
2. Умножить на 2
Программа для исполнителя КтоТут – это последовательность команд. Сколько существует программ, для которых при исходном числе 4 результатом является число 47, и при этом траектория вычислений не содержит число 28?
Решение рекурсией
Определим функцию f(a, b), которая будет вызывать саму себя. Она подсчитает количество программ, преобразующих число a в b. Функция возвращает:
- 0, если a > b, так как такая траектория точно не будет подходящей и ее не нужно учитывать в подсчете количества траекторий;
- 1, если a == b, так как единица означает, что мы нашли путь, который число А может превратить в число B выполнив все условия задачи;
- сумму значений для трёх возможных переходов (умножить на 2, +3), если a < b, так как такая траектория еще не нарушила условия задачи и может стать подходящей.
# Функция для подсчета количества программ преобразования a -> b def f(x, y): if x > y or x == 28: # Если число стало больше нужного или 28 return 0 elif x == y: # Если дошли до нужного числа return 1 else: return f(x + 3, y) + f(x * 2, y) # Количество путей до текущего числа print(f(4, 47)) # Найдем ответ по условию задачи
Решение динамикой
Динамический способ решения заключается в подсчете количества траекторий для каждого числа опираясь на подсчеты для предыдущих значений. Так, например, для подсчета количества траекторий до числа 8 необходимо знать количество траекторий до числа 5, 6 и 7.
Для реализации этого способа в программе создадим список, изначально заполненный нулями. Каждое число в списке будет обозначать количество траекторий до определенного числа. Далее пройдем по списку и заполним его значениями. Значение для каждой i-ой ячейки равно сумме значений для ячеек с индексами i - 3 и i // 2.
# Создаем массив для хранения количества путей до чисел от 5 до 47 # a[i] - количество программ, которые преобразуют число 4 в число i a = [0] * 100 a[4] = 1 # Начальное число for i in range(5, 48): a[i] = a[i - 3] + a[i // 2] * (i % 2 == 0) # Будем делить на 2 только если число кратно 2 a[28] = 0 # Пропустим 28 print(a[47]) # Выводим ответ
Ошибка.
Попробуйте повторить позже
Исполнитель Робот преобразует число на экране. У исполнителя есть две команды, которым присвоены номера:
1. Прибавить 1
2. Умножить на 2
Программа для исполнителя Робот – это последовательность команд. Сколько существует программ, для которых при исходном числе 5 результатом является число 31, и при этом траектория вычислений не содержит число 14?
Решение рекурсией
Мы используем рекурсивный способ для подсчета количества программ, которые переводят число в число
,
не проходя через запрещённое число 14. Для этого определяем функцию f(n, m). Внутри функции мы делаем
следующие проверки:
1. Если текущее число равно целевому
,
- значит мы достигли результата корректным путем,
- возвращаем 1.
2. Если текущее число превысило
или равно запрещённому числу 14,
- дальнейшее движение невозможно,
- возвращаем 0.
3. В остальных случаях мы пробуем оба возможных действия:
- прибавляем 1 к текущему числу, вызывая f(n+1, m),
- умножаем текущее число на 2, вызывая f(n*2, m).
- Суммируем результаты этих двух вызовов, чтобы получить общее количество программ, ведущих к из
текущего
.
Таким образом, рекурсия последовательно перебирает все допустимые последовательности команд, исключая запрещённое число 14, и считает количество корректных программ.
# Определяем функцию f(n, m), которая считает количество программ def f(n, m): # Если текущее число равно целевому, # значит найден корректный путь, возвращаем 1 if n == m: return 1 # Если текущее число больше целевого # или равно запрещённому числу 14, # дальнейшие действия невозможны, возвращаем 0 if n > m or n == 14: return 0 # В остальных случаях считаем все возможные пути: # 1) прибавляем 1 # 2) умножаем на 2 # Суммируем результаты этих вариантов return f(n+1, m) + f(n*2, m) # Вызываем функцию для исходного числа 5 и целевого числа 31 # и выводим общее количество корректных программ print(f(5, 31))
—
Решение динамикой
Мы можем использовать динамическое программирование для подсчета количества программ, создавая массив, где каждый индекс соответствует числу, а значение в ячейке — количеству программ, приводящих к этому числу из исходного числа 5, без прохождения через запрещённое число 14.
1. Создаём массив a длиной 32 (для чисел от 0 до 31), изначально заполняем его нулями.
2. Устанавливаем a[5] = 1, так как исходное число 5 даёт ровно один путь к самому себе.
3. Проходим циклом по числам от 6 до 31:
- Для каждого числа добавляем количество способов добраться из
(команда «прибавить
1»).
- Если число чётное, добавляем количество способов добраться из
(команда «умножить на
2»).
4. После заполнения массива исключаем запрещённое число: a[14] = 0.
5. В конце a[31] содержит количество программ, которые переводят 5 в 31 без прохождения через 14.
# Создаем массив для чисел от 0 до 31, изначально все значения 0 a = [0] * 32 # Начальное число 5, один способ быть в нем a[5] = 1 # Перебираем числа от 6 до 31 включительно for i in range(6, 32): # Количество способов добраться до i через прибавление 1 # и через умножение на 2, если i четное a[i] = a[i - 1] + a[i // 2] * (i % 2 == 0) # Запрещаем проход через число 14 a[14] = 0 # Выводим количество программ, которые ведут от 5 к 31 print(a[31])