Тема 23. Оператор присваивания и ветвления

23.01 Количество программ из A в B

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела оператор присваивания и ветвления
Решаем задачи

Ошибка.
Попробуйте повторить позже

Задача 1#5776

Исполнитель Калькулятор преобразует число, записанное на экране.
У исполнителя есть две команды, которым присвоены номера:
1. Прибавь 2,
2. Умножь на 3.
Первая из них увеличивает число на экране на 2  , вторая — увеличивает его в 3  раза.
Программа для Калькулятора — это последовательность команд.
Сколько есть программ, которые преобразуют число 2  в число 42  ?

Показать ответ и решение

Решение аналитикой:

Количество программ, которые преобразуют число 2 в число n,  обозначим R(n).  Число 2 у нас уже есть, значит, его можно получить с помощью “пустой” программы. Любая непустая программа увеличит исходное число, т.е. даст число, больше 2. Значит, R (2) = 1.  Для каждого следующего числа рассмотрим, из какого числа оно может быть получено за одну команду исполнителя. Если число не делится на три, то оно может быть получено только из предыдущего с помощью команды прибавь 2. Значит, количество искомых программ для такого числа равно количеству программ для предыдущего возможного числа: R (n) = R (n − 2).
Если число на три делится, то вариантов последней команды два: прибавь 2 и умножь на 3, тогда R (n) = R (n − 2) + R(n : 3).  Заполним таблицу по данной формуле:

|--|--|--|--|----|---|---|---|---|----|---|---|---|---|----|---|---|---|----|---|---|
|2 |4 |6 |8 |10  |12 |14 |16 |18 |20  |22 |24 |26 |28 | 30 |32 |34 |36 |38  |40 |42 |
|1-|1-|2-|2-|-2--|3--|3--|-3-|-5-|-5--|5--|7--|-7-|-7-|-9--|9--|-9-|12-|12--|12-|15-|
-------------------------------------------------------------------------------------

Отсюда видим, что всего программ 15.

Решение программой:

a = [0] * 100
a[2] = 1
for i in range(3, 42 + 1):
    a[i] = a[i - 2]
    if i % 3 == 0:
        a[i] += a[i // 3]
print(a[42])

Ответ: 15

Ошибка.
Попробуйте повторить позже

Задача 2#6376

Исполнитель М.Е.М.249 преобразует целое число, записанное на экране.
У исполнителя две команды, которым присвоены номера:
преобразует целое число, записанное на экране.
1. Прибавить 1,
2. Прибавить 2,
3. Прибавить предыдущее.
Первая команда увеличивает число на экране на 1, вторая увеличивает это число на 2, третья прибавляет к числу на экране число, меньшее на 1 (к числу 3 прибавляется 2, к числу 11 прибавляется 10 и т. д.).
Программа для исполнителя М.Е.М.249 – это последовательность команд.
Сколько существует программ, которые число 1 преобразуют в число 10?

Показать ответ и решение

Обозначим число программ, преобразующих число 2 в число n как R (n).  Тогда число n  может быть получено либо прибавлением к n − 1,  либо к n −  2,  либо из некоторого числа   увеличением на x − 1,  так что n = x + x − 1,  откуда      n+1-
x =   2 ;  так могут быть получены только нечетные числа.
Тогда для четных чисел R (n ) = R(n − 1) + R (n − 2),  а для нечетных — R(n) = R (n − 1) + R (n −  2) + R (n+21   ). Заполним таблицу по данным формулам:

|1-|2-|3-|4-|-5-|-6-|-7--|8--|9--|-10-|
|--|--|--|--|---|---|----|---|---|----|
-1--1--3--4--10--14--28---42--80--122--
Отсюда получаем искомое количество программ — 122.
Ответ: 122

Ошибка.
Попробуйте повторить позже

Задача 3#6478

Исполнитель МЕГАТРОН преобразует число, записанное на экране.
У исполнителя есть две команды, которым присвоены номера:
1. Прибавь 1,
2. Прибавь 2.
Первая из них увеличивает число на экране на 1, вторая — увеличивает его на 2.
Программа для МЕГАТРОНа — это последовательность команд.
Сколько есть программ, которые преобразует число 1 в число 9?

Показать ответ и решение

Количество программ, которые преобразуют число 1 в число n,  обозначим R(n).  Число 1 у нас уже есть, значит, его можно получить с помощью “пустой” программы. Любая непустая программа увеличит исходное число, т.е. даст число, больше 1. Значит, R (1) = 1.  Для каждого следующего числа рассмотрим, из какого числа оно может быть получено за одну команду исполнителя. Число “2” может быть получено только из числа “1” командой под номером 1. Отсюда R (2) = 1.  Число “3” можем получить из чисел 1 и 2 — R (3) = R(1) + R (2 ) = 2.  Число “4” получаем из 2 и 3 — R (4) = R (2) + R(3) = 3.  Можем заметить, что количество программ для получения числа n находится по формуле — R(n ) = R (n − 2) + R (n − 1).  Составим таблицу по данной формуле:

|--|---|--|--|--|--|---|---|----|
|1-|2--|3-|4-|5-|6-|-7-|-8-|-9--|
|1 |1  |2 |3 |5 |8 |13 |21 |34  |
--------------------------------
Отсюда видим, что имеем 34 возможных программ для получения числа 9.
Ответ: 34

Ошибка.
Попробуйте повторить позже

Задача 4#6479

Исполнитель ХЛЕБУШЕК преобразует число, записанное на экране.
У исполнителя есть три команды, которым присвоены номера:
1. Прибавь 1,
2. Прибавь 2,
3. Прибавь 3.
Первая из них увеличивает число на экране на 1, вторая — увеличивает его на 2, третья — увеличивает его на 3.
Программа для ХЛЕБУШКа — это последовательность команд.
Сколько есть программ, которые преобразуют число 1 в число 14?

Показать ответ и решение

Количество программ, которые преобразуют число 1 в число n, обозначим R (n).  Число 1 у нас уже есть, значит, его можно получить с помощью “пустой” программы. Любая непустая программа увеличит исходное число, т.е. даст число, больше 1. Значит, R (1) = 1.  Для каждого следующего числа рассмотрим, из какого числа оно может быть получено за одну команду исполнителя. Число “2” может быть получено только из числа “1” командой под номером 1. Отсюда R (2) = 1.  Число “3” можем получить из чисел 1 и 2 — R (3) = R(1) + R (2) = 2.  Число “4” получаем из 1, 2 и 3 — R (4) = R (1 ) + R (2) + R(3) = 6.  Заметим, что количество программ для получения числа n находится по формуле — R (n) = R(n − 3 ) + R (n − 2) + R(n − 1 ).  Составим таблицу по данной формуле:

|--|--|--|--|--|----|---|---|---|-----|----|----|-----|-----|
|1-|2-|3-|4-|5-|-6--|7--|8--|-9-|-10--|11--|-12-|-13--|-14--|
|1 |1 |2 |4 |7 |13  |24 |44 |81 |149  |274 |504 |927  |1705 |
-------------------------------------------------------------
Отсюда получаем искомое количество программ — 1705.
Ответ: 1705

Ошибка.
Попробуйте повторить позже

Задача 5#6481

Исполнитель Прибавлялка имеет две команды, которым присвоены номера:
1. Прибавь 1,
2. Увеличь старшую цифру числа на 1.
Первая из них увеличивает число на экране на 1, вторая увеличивает на 1 старшую (левую) цифру числа, например число 63 с помощью такой команды превратится в число 73. Если старшая цифра числа равна 9, то вторая команда оставляет это число неизменным.
Программа для Прибавлялки — это последовательность команд.
Сколько есть программ, которые число 31 преобразуют в число 53?

Показать ответ и решение

Обе команды увеличивают исходное число. Старшая цифра — 3, следовательно, использовать команду 2 более двух раз бессмысленно.
Выпишем программы, в которых команда 2 используется два раза: 1122, 2211, 1212, 2121, 2112, 1221. Итого 6 программ.
Выпишем программы, в которых команда 2 используется один раз. Использовав эту команду в первой позиции, мы получим из числа 31 число 41, следовательно, после этого необходимо будет дописать ещё 12 команд 1 чтобы получить число 53. Таким образом, получаем программы: 211...1,  121 ...1,  и. т. д. Итого имеем 13 программ (двойка побывала в каждой позиции).
Существует лишь одна программа, в которой команда 2 не используется: 111 ...1.
Таким образом получаем 6 + 13 + 1 = 20.

 

Ответ: 20

Ошибка.
Попробуйте повторить позже

Задача 6#6870

Исполнитель преобразует целое число, записанное на экране.

У исполнителя три команды. Каждой команде присвоен номер:

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

2. Прибавить 2,

3. Умножить на 4

Первая из них увеличивает число на экране на 1, второе - увеличивает его на 2, третья - увеличивает его в 4 раза.

Программа - это последовательность команд.

Сколько есть программ, которые преобразуют число 2 в число 17?

Показать ответ и решение

Количество программ, которые преобразуют число 2 в число n, обозначим R(n). Число 2 у нас уже есть, значит, его можно получить с помощью “пустой” программы. Любая непустая программа увеличит исходное число, т.е. даст число, больше 2. Значит, R(2) = 1. Для каждого следующего числа рассмотрим, из какого числа оно может быть получено за одну команду исполнителя. Если число не делится на 4, то оно может быть получено командами 1 и 2. Значит, количество искомых программ для такого числа равно количеству программ для предыдущего возможного числа: R (n) = R (n − 1) + R(n − 2)  .

Если число делится на 4, то вариантов последней команды три: прибавить 1, прибавить 2 и умножить на 4, тогда R (n) = R (n − 1) + R(n − 2 ) + R (n : 4)  . Заполним таблицу по данной формуле:

|--|--|---|--|--|--|---|---|---|----|---|----|-----|----|----|------|
|2-|3-|4--|5-|6-|7-|8--|-9-|10-|11--|12-|13--|-14--|15--|-16-|-17---|
|1 |1 |2  |3 |5 |8 |14 |22 |36 |58  |95 |153 |248  |401 |651 |1052  |
--------------------------------------------------------------------
Отсюда получаем искомое количество программ — 1052.
Ответ: 1052

Ошибка.
Попробуйте повторить позже

Задача 7#7622

Исполнитель ЕЩЕНКО преобразует целое число, записанное на экране.
У исполнителя две команды, которым присвоены номера:
1. Прибавь 2,
2. Умножь на 10.
Первая из них увеличивает число на экране на 2, второе - увеличивает его в 10 раз.
Программа для Калькулятора - это последовательность команд.
Сколько есть программ, которые преобразуют число 2 в число 40?

Показать ответ и решение

Количество программ, которые преобразуют число 2 в число n, обозначим R (n)  . Число 2 у нас уже есть, значит, его можно получить с помощью “пустой” программы. Любая непустая программа увеличит исходное число, т.е. даст число, больше 2. Значит, R (2) = 1  . Для каждого следующего числа рассмотрим, из какого числа оно может быть получено за одну команду исполнителя. Если число не делится на десять, то оно может быть получено только из предыдущего с помощью команды прибавь 2. Значит, количество искомых программ для такого числа равно количеству программ для предыдущего возможного числа: R (n) = R (n − 2)  .
Если число делится на 10, то вариантов последней команды два: прибавь 2 и умножь на 10, тогда R (n) = R (n − 2) + R(n : 10 )  . Заполним таблицу по данной формуле:

|--|--|--|--|----|---|---|---|----|---|---|---|---|----|---|---|---|---|----|---|
|2-|4-|6-|8-|10--|12-|14-|16-|18--|20-|22-|24-|26-|28--|30-|32-|34-|36-|-38-|40-|
|1 |1 |1 |1 | 1  |1  |1  | 1 | 1  |2  |2  | 2 | 2 | 2  |2  |2  | 2 | 2 | 2  |3  |
--------------------------------------------------------------------------------

Отсюда получаем искомое количество программ - 3.

 

Ответ: 3

Ошибка.
Попробуйте повторить позже

Задача 8#11525

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

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

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

Первая команда увеличивает число на экране на 1  , вторая — увеличивает на 2  . Программа для исполнителя Крабоед — это последовательность команд.

Сколько существует программ, для которых при исходном числе 1  результатом является число 10  ?

Показать ответ и решение

Решение динамикой

a = [0] * (10 + 1)  # Создаем ячейки до конечного числа включительно
a[1] = 1  # Задаём начало в числе 1
for i in range(2, 10 + 1):
    # В текущее число i можно попасть командой +1 и +2
    a[i] = a[i - 1] + a[i - 2]
print(a[10])

Решение рекурсией

# Аргумент a - текущее число, к которому применяются команды
def f(a):
    if a > 10:  # Число стало больше конечного результата, его достигнуть уже не выйдет
        return 0  # Возвращаем 0, не изменяющее количество траекторий
    if a == 10:  # Достигли конечного результата
        return 1  # Возвращаем 0, увеличивающее количество траекторий на 1
    return f(a + 1) + f(a + 2)  # Суммируем количество траекторий от рекурсивных вызовов


print(f(1)) # Запускаем функцию от исходного числа 1

Ответ: 55

Ошибка.
Попробуйте повторить позже

Задача 9#12828

Исполнитель преобразует число на экране.

У исполнителя есть две команды, которым присвоены номера:

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

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

Первая команда увеличивает число на экране на 1, вторая увеличивает число в 2 раза.

Программа для исполнителя – это последовательность команд.

Сколько существует программ, которые преобразуют исходное число 1 в число 16?

Показать ответ и решение

Решение динамикой

a = [0] * (16 + 1)  # Создаем ячейки до конечного числа включительно
a[1] = 1  # Задаём начало в числе 1
for i in range(2, 16 + 1):
    a[i] = a[i - 1]  # В текущее число можно попасть командой +1
    if i % 2 == 0:  # Если в текущее число можно было попасть командой *2
        a[i] += a[i // 2]
print(a[16])

Решение рекурсией

def f(a):
    if a > 16:
        return 0
    if a == 16:
        return 1
    return f(a + 1) + f(a * 2)


print(f(1))

Решение руками

В четные числа мы можем попасть из числа деленного на 2 или предыдущего, а в нечетные только из предыдущих.
Получается, что в число 2 мы можем попасть из 1 двумя разными способами.
В число 3 мы можем попасть только из 2.
В число 4 мы можем попасть из 2 или 3.
В число 5 мы можем попасть только из 4.
И т.д.

PIC

Ответ: 36

Ошибка.
Попробуйте повторить позже

Задача 10#16435

Дед Мороз написал программу для исполнителя ЮП, который преобразовывает числа. У исполнителя ЮП две команды, которым присвоены номера:

1. прибавь 1,

2. прибавь 3.

Первая из них увеличивает на 1 число на экране, вторая увеличивает это число на 3.

Программа для ЮП — это последовательность команд.

Сколько существует программ, которые число 5 преобразуют в число 42?

Показать ответ и решение
    a = [0]*50  
    a[5] = 1  
    for i in range(6,43):  
        a[i] = a[i-1]+a[i-3]  
    print(a[42])

Ответ: 848491

Ошибка.
Попробуйте повторить позже

Задача 11#16436

Также Дед мороз написал ещё одного исполнителя ДЮ, который всё также преобразовывает числа. У исполнителя ДЮ три команды, которым присвоены номера:

  1. прибавь 2,
  2. умножь 3,
  3. прибавь 1.

Первая из них увеличивает на 2 число на экране, вторая увеличивает это число в 3 раза, третья - увеличивает на 1.

Программа для ДЮ — это последовательность команд.

Сколько существует программ, которые число 4 преобразуют в число 63?

Показать ответ и решение
a = [0] * 64
a[4] = 1
for i in range(5, 64):
    a[i] = a[i - 1] + a[i - 2] + a[i // 3] * (i % 3 == 0)
print(a[63])

Ответ: 1594537164339

Ошибка.
Попробуйте повторить позже

Задача 12#16514

Исполнитель ЕЛОЧКА преобразует число, записанное на экране.

У исполнителя есть команды, которым присвоены номера:

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

Первая команда увеличивает число на экране на 1  , вторая — на 10  .

Сколько существует программ, для которых при исходном числе 7  результатом является число 49  ? Траектория вычислений программы — это последовательность результатов выполнения всех команд программы.

Показать ответ и решение

Решение 1

num = [0]*50
num[7] = 1
for i in range(8, 50):
num[i] = num[i-1] + num[i-10]
print(num[49])

Решение 2

a = [0] * 60
a[7] = 1
for i in range(7, 50):
a[i + 1] += a[i]
a[i + 10] += a[i]
print(a[49])

Ответ: 780

Ошибка.
Попробуйте повторить позже

Задача 13#16516

Исполнитель ГИРЛЯНДА преобразует число, записанное на экране.

У исполнителя есть команды, которым присвоены номера:

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

2. Прибавить 3

Первая команда увеличивает число на экране на 1, вторая — на 3.

Сколько существует программ, для которых при исходном числе 4 результатом является число 30? Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы 121 при исходном числе 1 траектория будет состоять из чисел 2, 5, 6.

Показать ответ и решение
  num = [0]*31  
  num[4] = 1  
  for i in range(5, 31):  
      num[i] = num[i-1]+num[i-3]  
  print(num[30])

Ответ: 12664

Ошибка.
Попробуйте повторить позже

Задача 14#16517

Исполнитель ПОДАРОК преобразует число, записанное на экране.

У исполнителя есть команды, которым присвоены номера:

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

2. Прибавить 5

Первая команда увеличивает число на экране на 2  , вторая — на 5  .

Сколько существует программ, для которых при исходном числе 1  результатом является число 19  ? Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы 121  при исходном числе 1  траектория будет состоять из чисел 3,8,10  .

Показать ответ и решение
  num = [0]*20  
  num[1] = 1  
  for i in range(2, 20):  
      num[i] = num[i-2]+num[i-5]*(i > 5)  
  print(num[19])

Ответ: 16

Ошибка.
Попробуйте повторить позже

Задача 15#16518

Исполнитель Крабокраб преобразует число, записанное на экране.

У исполнителя есть команды, которым присвоены номера:

  1. Прибавить 1  ;
  2. Прибавить 4  .

Первая команда увеличивает число на экране на 1  , вторая — на 4  .

Сколько существует программ, для которых при исходном числе 1  результатом является число 128  ? Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы 121  при исходном числе 1  траектория будет состоять из чисел 2,6,7  .

Показать ответ и решение
  num = [0]*129  
  num[1] = 1  
  for i in range(2, 129):  
      num[i] = num[i-1]+num[i-4]  
  print(num[128])

Ответ: 326671493536033573

Ошибка.
Попробуйте повторить позже

Задача 16#22214

Исполнитель Крабовсад преобразует число, записанное на экране.

У исполнителя есть команды, которым присвоены номера:

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

2. Прибавить 10

Первая команда увеличивает число на экране на 1  , вторая — на 10  .

Сколько существует программ, для которых при исходном числе 7  результатом является число 49  ? Траектория вычислений программы — это последовательность результатов выполнения всех команд программы.

Показать ответ и решение
num = [0]*60
num[7] = 1
for i in range(8, 60):
    num[i] = num[i-1] + num[i-10]
print(num[49])

Ответ: 780

Ошибка.
Попробуйте повторить позже

Задача 17#22215

Исполнитель РОКЕТ преобразует число, записанное на экране.

У исполнителя есть команды, которым присвоены номера:

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

2. Прибавить 3

Первая команда увеличивает число на экране на 1, вторая − на 3.

Сколько существует программ, для которых при исходном числе 4 результатом является число 30? Траектория вычислений программы − это последовательность результатов выполнения всех команд программы. Например, для программы 121 при исходном числе 1 траектория будет состоять из чисел 2, 5, 6.

Показать ответ и решение
num = [0]*31  
num[4] = 1  
for i in range(5, 31):  
    num[i] = num[i-1]+num[i-3]  
print(num[30])

Ответ: 12664

Ошибка.
Попробуйте повторить позже

Задача 18#22216

Исполнитель МАШИНА преобразует число, записанное на экране.

У исполнителя есть команды, которым присвоены номера:

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

2. Прибавить 5

Первая команда увеличивает число на экране на 2, вторая − на 5.

Сколько существует программ, для которых при исходном числе 1 результатом является число 19? Траектория вычислений программы − это последовательность результатов выполнения всех команд программы. Например, для программы 121 при исходном числе 1 траектория будет состоять из чисел 3, 8, 10.

Показать ответ и решение
num = [0]*20  
num[1] = 1  
for i in range(2, 20):  
    num[i] = num[i-2]+num[i-5]*(i > 5)  
print(num[19])

Ответ: 16

Ошибка.
Попробуйте повторить позже

Задача 19#23510

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

  1. Прибавить 1  ;
  2. Умножить на 4  .

Программа для исполнителя Крабика — это последовательность команд. Сколько существует программ, которые число 1  преобразуют в число 55  ?

Показать ответ и решение

Решение 1

a = [0] * 56
a[1] = 1
for i in range(2, 56):
    a[i] = a[i - 1] + a[i // 4] * (i % 4 == 0)
print(a[55])

Решение 2

a = [0] * 55 * 4 + 1
a[1] = 1
for i in range(1, 55):
    a[i + 1] += a[i]
    a[i * 4] += a[i]
print(a[55])

Ответ: 32

Ошибка.
Попробуйте повторить позже

Задача 20#24424

Исполнитель АИ решает 23  -и задачи. Когда он выбирает, сколько еще задач он хочет решить, он выполняет одно из двух действий:

  1. Увеличить количество решенных задач на 1
  2. Решить еще столько задач, чтобы суммарное число уже решенных задач увеличилось в 1.5  раза. Действие допустимо, если АИ уже решил четное количество задач.

Пока что АИ решил только 1  задачу. Сколькими способами АИ может сделать так, чтобы число решенных задач стало равно 20  ?

Показать ответ и решение

Решение 1 (Рекурсия)

def f(s, fi):
    if s > fi:
        return 0
    if s == fi:
        return 1
    if s % 2 != 0:
        return f(s + 1, fi)
    else:
        return f(s + 1, fi) + f(s * 1.5, fi)
print(f(1, 20))

Решение 2 (Динамика)

a = [0] * 21
a[1] = 1
for i in range(2, 21):
    a[i] = a[i - 1] + a[i - i // 3] * (i % 3 == 0)
print(a[20])

Ответ: 32
Рулетка
Вы можете получить скидку в рулетке!