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

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

Задача 1#43112

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

1. Вычесть 1  ;

2. Поделить на 3  нацело.

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

Сколько существует программ, для которых при исходном числe 43  результатом является число 1  , при этом траектория вычислений не содержит число 8  .

Траектория вычислений — это последовательность результатов выполнения всех команд программы. Например, для программы 12  при исходном числе 11  траектория будет состоять из чисел 10,3  .

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

Ответ: 189

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

Задача 2#43111

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

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

1. Вычесть 5  ;

2. Вычесть 2  ;

3. Разделить 5  , если кратно 5  .

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

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

Показать ответ и решение
a = [0] * (48 * 5 + 1)
a[49] = 1
for i in range(48, 0, -1):
    a[i] = a[i + 5] + a[i + 2] + a[i * 5]
    if i == 13:
        for j in range(48, i, -1):
            a[j] = 0
print(a[1])

Ответ: 3425

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

Задача 3#30481

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

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

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

3. Прибавить само число

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

Сколько существует программ, для которых при исходном числe 1 результатом является число 28, при этом программа содержит 9 команд, а траектория обязательно не проходит через число 11 и проходит через 13?

Траектория вычислений — это последовательность результатов выполнения всех команд программы. Например, для программы 123 при исходном числе 2 траектория будет состоять из чисел 5, 6, 12.

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

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

def f(st, fn, flag, flag_number, exit_number, count, end_count):
    if st == fn and count == end_count and flag:
        return 1
    if st > fn or count > end_count or st == exit_number:
        return 0
    if st == flag_number:
        flag = True
    x = f(st + 1, fn, flag, flag_number, exit_number, count + 1, end_count)
    y = f(st + 3, fn, flag, flag_number, exit_number, count + 1, end_count)
    z = f(st * 2, fn, flag, flag_number, exit_number, count + 1, end_count)
    return x + y + z
print(f(1, 28, False, 13, 11, 0, 9))

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

ans = []
ans.append((1, 0))
for operations in range(9):
    can_get = []
    for i in ans:
        a, flag = i
        if a == 11:
            continue
        if a + 3 == 13:
            can_get.append((a + 3, 1))
        else:
            can_get.append((a + 3, flag))
        if a + 1 == 13:
            can_get.append((a + 1, 1))
        else:
            can_get.append((a + 1, flag))
        if 2 * a == 13:
            can_get.append((2 * a, 1))
        else:
            can_get.append((2 * a, flag))
    ans = can_get
otv = 0
for i in ans:
    a, flag = i
    if (a == 28) and (flag):
        otv += 1
print(otv)

Ответ: 63

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

Задача 4#30480

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

1. Прибавить 2, если число кратно 3

2. Прибавить 3, если число кратно 2

3. Прибавить 1, если число не кратно ни 2, ни 3

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

Сколько существует программ, для которых при исходном числe 3 результатом является число 27, при этом программа содержит 12 команд, а траектория обязательно не проходит через число 22?

Траектория вычислений — это последовательность результатов выполнения всех команд программы. Например, для программы 132 при исходном числе 3 траектория будет состоять из чисел 5, 6, 9.

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

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

def f(st, fn, exit_number, count, end_count):
    if st == fn and count == end_count:
        return 1
    if st > fn or count > end_count or st == exit_number:
        return 0
    x = f(st + 2, fn, exit_number, count + 1, end_count) * (st % 3 == 0)
    y = f(st + 3, fn, exit_number, count + 1, end_count) * (st % 2 == 0)
    z = f(st + 1, fn, exit_number, count + 1, end_count) * (st % 2 != 0
                                                            and st % 3 != 0)
    return x + y + z
print(f(3, 27, 22, 0, 12))

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

ans = []
ans.append(3)
for operations in range(12):
    can_get = []
    for i in ans:
        if i == 22:
            continue
        if i % 3 == 0:
            can_get.append(i + 2)
        if i % 2 == 0:
            can_get.append(i + 3)
        if (i % 2 != 0) and (i % 3 != 0):
            can_get.append(i + 1)
    ans = can_get
print(ans.count(27))

Ответ: 8

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

Задача 5#30479

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

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

2. Если число кратно 8  , прибавить к нему это же число, умноженное на 0.75

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

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

Сколько существует программ, для которых при исходном числe 3 результатом является число 50, при этом программа содержит 20 команд, а траектория обязательно проходит через число 15?

Траектория вычислений — это последовательность результатов выполнения всех команд программы. Например, для программы 123 при исходном числе 7 траектория будет состоять из чисел 8, 14, 28.

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

Стоит сказать, что динамическое решение данной задачи более трудоемкое и занимает большее количество времени для исполнения. Поэтому рекомендуется использовать именно рекурсивную реализацию.

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

def f(st, fn, flag, flag_number, count, end_count):
    if st == fn and count == end_count and flag:
        return 1
    if st > fn or count > end_count:
        return 0
    if st == flag_number:
        flag = True
    x = f(st + 1, fn, flag, flag_number, count + 1, end_count)
    y = f(st * 2, fn, flag, flag_number, count + 1, end_count)
    z = f(st + st * 0.75, fn, flag, flag_number, count + 1, end_count) * \
(st % 8 == 0)
    return x + y + z
print(f(3, 50, False, 15, 0, 20))

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

ans = []
ans.append((3, 0))
for operations in range(20):
    can_get = []
    for i in ans:
        a, flag = i
        if a + 1 == 15:
            can_get.append((a + 1, 1))
        else:
            can_get.append((a + 1, flag))
        if a % 8 == 0:
            if int(a + a * 0.75) == 15:
                can_get.append((int(a + a * 0.75), 1))
            else:
                can_get.append((int(a + a * 0.75), flag))
        can_get.append((a * 2, flag))
    ans = can_get
otv = 0
for i in ans:
    a, flag = i
    if (a == 50) and (flag):
        otv += 1
print(otv)

Ответ: 9

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

Задача 6#30475

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

  1. Прибавить 3
  2. Умножить на 2
  3. Возвести в третью степень

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

Сколько существует программ, для которых при исходном числe 3  результатом является число 96  , при этом траектория вычислений не содержит числа 25  , но содержит число 12  .

Траектория вычислений — это последовательность результатов выполнения всех команд программы. Например, для программы 123  при исходном числе 6  траектория будет состоять из чисел 9,18,5832  .

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

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

def f(st, fn, flag, flag_number, exit_number):
    if st == fn and flag:
        return 1
    if st > fn or st == exit_number:
        return 0
    if st == flag_number: # поднимаем флаг, если дошли до требуемого значения
        flag = True
    x = f(st + 3, fn, flag, flag_number, exit_number)
    y = f(st * 2, fn, flag, flag_number, exit_number)
    z = f(st ** 3, fn, flag, flag_number, exit_number)
    return x + y + z
print(f(3, 96, False, 12, 25))

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

a = [0] * (96 ** 3 + 1)
a[3] = 1
for i in range(3, 96):
    if i == 12:
        b = a[i]
        a = [0] * (96 ** 3 + 1)
        a[i] = b
    if i != 25:
        a[i + 3] += a[i]
        a[i * 2] += a[i]
        a[i ** 3] += a[i]
print(a[96])

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

a = [0] * 97
a[3] = 1
for i in range(4, 97):
    a[i] = a[i - 3] + a[i // 2] * (i % 2 == 0)
    x = int(i ** (1 / 3))
    if x ** 3 == i:
        a[i] += a[x]
    if i == 12:
        for j in range(i):
            a[j] = 0
    if i == 25:
        a[i] = 0
print(a[96])

Ответ: 160

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

Задача 7#29370

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

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

Первая команда увеличивает число на экране на 2,  вторая — увеличивает число в 3  раза. Программа для исполнителя Крабоед — это последовательность команд. Сколько существует программ, для которых при исходном числе 10  результатом является число 100,  и при этом траектория вычислений не содержит 99  и содержит 50  ?

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

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

def f(s, fi, flag):
    if s > fi:
        return 0
    if s == 99:
        return 0
    if s == 50:
        flag = True
    if s == fi and flag:
        return 1
    return f(s + 2, fi, flag) + f(s * 3, fi, flag)
print(f(10, 100, False))

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

a = [0] * 101
a[10] = 1
for i in range(11, 101):
    a[i] = a[i - 2] + a[i // 3] * (i % 3 == 0)
    if i == 99:
        a[i] = 0
    if i == 50:
        for j in range(i):
            a[j] = 0
print(a[100])

Ответ: 5

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

Задача 8#26183

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

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

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

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

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

Сколько существует программ, для которых при исходном числе 3 результатом является число 45 и при этом траектория вычислений содержит число 10 и не содержит число 15?

Ответ дайте в шестеричной системе счисления

Показать ответ и решение
def perevod(n, a):
    s = ’’
    while n != 0:
        s = str(n % a) + s
        n //= a
    return s


a = [0]*46
a[3] = 1
for i in range(4, 46):
    a[i] = a[i-1]
    if i % 2 == 0:
        a[i] += a[i//2]
    if i == 15:
        a[i] = 0
    if i == 10:
        for j in range(i):
            a[j] = 0
print(perevod(a[45], 6))

Ответ: 100

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

Задача 9#25942

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

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

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

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

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

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

Сколько существует программ, для которых при исходном числе 3  результатом является число 20  и при этом траектория вычислений содержит число 12  и не содержит числа 7  ?

Показать ответ и решение
a = [0]*21
a[3] = 1
for i in range(4, 21):
    a[i] = a[i-1]+a[i-3]
    if i % 4 == 0:
        a[i] += a[i//4]
    if i == 12:
        for j in range(i):
            a[j] = 0
    if i == 7:
        a[i] = 0
print(a[20])

Ответ: 104

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

Задача 10#25594

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

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

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

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

Программа для исполнителя — это последовательность команд. Сколько существует программ, которые преобразуют исходное число 2  в число 15  , и при этом траектория вычислений содержит число 10  и не содержит числа 14  ?

Траектория вычислений — это последовательность результатов выполнения всех команд программы. Например, для программы 213  при исходном числе 4  траектория будет состоять из чисел 6  , 7  , 21  .

Показать ответ и решение
a = [0]*16
a[2] = 1
for i in range(3, 16):
    a[i] = a[i-1]+a[i-2]
    if i % 3 == 0:
        a[i] += a[i//3]
    if i == 10:
        for j in range(1, i):
            a[j] = 0
    if i == 14:
        a[i] = 0
print(a[15])

Ответ: 120

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

Задача 11#11542

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

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

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

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

Программа для исполнителя АС — это последовательность команд. Сколько существует программ, которые преобразуют исходное число 1  в число 50  , и при этом траектория вычислений содержит число 14  и не содержит числа 16  ?

Показать ответ и решение
a = [0]*51
a[1] = 1
for i in range(2, 51):
    a[i] = a[i-1]
    if i % 2 == 0:
        a[i] += a[i//2]
    if i % 3 == 0:
        a[i] += a[i//3]
    if i == 14:
        for j in range(14):
            a[j] = 0
    if i == 16:
        a[i] = 0
print(a[50])

Ответ: 192

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

Задача 12#11535

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

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

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

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

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

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

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

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

Показать ответ и решение
a = [0]*17
a[1] = 1
for i in range(2, 17):
    a[i] = a[i-1]
    if i > 5:
        a[i] += a[i-5]
    if i % 2 == 0:
        a[i] += a[i//2]
    if i == 10:
        a[i] = 0
    if i == 8:
        for j in range(8):
            a[j] = 0
print(a[16])

Ответ: 45

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

Задача 13#6869

Геральт копит чеканные монеты, количество которых записано на экране.

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

1. Прибавить 5 монет, убив утопца,

2. Прибавить 10 монет, выполнив заказ на призрака,

3. Увеличить количество монет в 2 раза, сыграв в гвинт.

Первый вариант учеличивает количество монет на 5, второй — на 10, третий — умножает количество монет на 2. Программа для Геральта из Ривии — это последовательность вариантов.

Геральту нужно накопить 100 монет, чтобы выкупить Лютика из плена эльфов.

Сколько существует программ, для которых при исходном количестве монет 15 является результатом 100 монет. При этом траектория вычислений содержит любимое число Геральта — 50 и не содержит числа 25 и 40? Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы 123 при исходном числе 7 траектория будет состоять из чисел 12, 22, 44.

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

Составим формулы:

R(n ) = R (n − 5) + R (n − 10)  — если число не делится на 2.

R(n ) = R (n − 5) + R (n − 10) + R (n : 2)  — если число делится на 2.

Заметим, что количество программ будет меняться только на числах кратных 5. Заполним таблицу по данным формулам, учитывая условия траектории:

|---|---|----|---|---|---|---|----|---|---|---|----|---|---|---|---|-----|----|
|15-|20-|25--|30-|35-|40-|45-|50--|55-|60-|65-|70--|75-|80-|85-|90-|-95--|100-|
|1  | 1 | 0  |2  |2  | 0 | 2 | 4  |2  |4  | 6 |10  |16 |26 |42 |68 |110  |180 |
-------------------------------------------------------------------------------

Лютик точно будет спасён!

Ответ: 180

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

Задача 14#6868

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

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

Прибавить 2,

Прибавить 3,

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

Первая команда увеличивает число на экране на 2, вторая увеличивает на 3, третья увеличивает число на экране в 2 раза. Программа для САПСАНа — это последовательность команд.

Сколько существует программ, для которых при исходном числе 1 результатом является число 15 и при этом траектория вычислений содержит число 6 и 9, но не содержит число 13? Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы 123 при исходном числе 7 траектория будет состоять из чисел 9, 12, 24.

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

Пусть R (n)  — количество программ, которые число 1 преобразуют в число n. Тогда верно следующее утверждение:

R(n ) = R (n − 2) + R (n − 3)  — если число не делится на 2.

R(n ) = R (n − 2) + R (n − 3) + R (n : 2)  — если число делится на 2.

Заполним таблицу по данной формуле до 6:

|--|--|--|--|--|--|
|1-|2-|3-|4-|5-|6-|
|1 |1 |1 |3 |2 |5 |
-------------------
Так как по условию сказано, что траектория должна содержать число 6, значит последующие числа мы можем получать только из 6. Продолжим заполнять таблицу:

|--|--|--|--|---|--|--|--|--|
|1 |2 |3 |4 |5  |6 |7 |8 |9 |
|--|--|--|--|---|--|--|--|--|
-1--1--1--3--2---5--0--5--5-|
Аналогично с 9. Сразу можно сказать, что число 13 нельзя никак получить, так как по условию траектория не должна через него проходить. Значит R (13) = 0  . Заполним таблицу до конца:

|--|---|--|--|--|--|--|--|--|---|----|---|---|---|----|
|1-|2--|3-|4-|5-|6-|7-|8-|9-|10-|-11-|12-|13-|14-|15--|
-1--1---1--3--2--5--0--5--5---0---5---5----0--10---5--|
Ответ: 5

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

Задача 15#6867

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

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

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

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

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

Первая команда увеличивает число на экране на 1, вторая – на 3, третья – утраивает число на экране. Программа для исполнителя Ф312 — это последовательность команд.

Сколько существует программ, для которых при исходном числе 2 результатом является число 33 и при этом траектория вычислений содержит число 12 и не содержит число 27? Траектория вычислений программы – это последовательность результатов выполнения всех команд программы. Например, для программы 231 при исходном числе 6 траектория будет состоять из чисел 9, 27, 28.

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

Пусть R (n)  — количество программ, которые число 1 преобразуют в число n. Тогда верно следующее утверждение:

R(n ) = R (n − 1) + R (n − 3)  — если число не делится на 3.

R(n ) = R (n − 1) + R (n − 3) + R (n : 3)  — если число делится на 3.

Заполним таблицу по формулам до 11:

|--|--|--|--|--|--|--|----|---|---|
|2-|3-|4-|5-|6-|7-|8-|-9--|10-|11-|
|1 |1 |1 |2 |4 |5 |7 | 12 |17 |24 |
-----------------------------------
По условию сказано, что траектория должна содержать число 12. Значит R(13) = 37  , так как число 13 можно получить только командой 1.

Продолжим заполнять таблицу:

|---|----|---|---|---|-----|----|----|-----|----|----|------|-----|------|-----|------|
|11-|-12-|13-|14-|15-|-16--|17--|-18-|-19--|20--|-21-|--22--|-23--|-24---|-25--|-26---|
-24---37--37--37--74--111---148--222--333---481--703--1036---1517--2220---3256--4773--|
По услолвию сказано, что траектория не должна содержать число 27. Значит R (27) = 0  .

Заполним таблицу до конца:

|-----|---|------|-----|------|------|-------|------|
|-26--|27-|-28---|-29--|-30---|-31---|--32---|-33---|
-4773---0--3256---8029--8029---11285--19314---27343--
Отсюда получаме ответ — 27343
Ответ: 27343
Рулетка
Вы можете получить скидку в рулетке!