К содержанию

Подтема 3 из 7

Обязательные и запрещённые числа

Как учесть обязательное и запрещённое число — и ответ задачи темы.

Обязательное число

Сколько программ из 2 в 20 проходят через 6? Запрет 9 пока не учитываем.

Обязательное число делит программу на две части, и количества частей перемножают. Любая такая программа сначала переводит 2 в 6, а потом 6 в 20:

  • первую часть можно выбрать 3 способами — подтема 1;
  • вторую — 6 способами — подтема 2;
  • любая первая часть подходит к любой второй.

Значит, программ 3 · 6 = 18.

Обрати внимание: второй участок считают заново — в 6 ставят 1. Если продолжить общую таблицу от 2 со значением K(6) = 3 и потом ещё умножить на 3, первые части посчитаются дважды.

Запрещённое число

Теперь 9 запрещено. Сколько программ из 6 в 20 его обходят?

В запрещённое число ставят K = 0: ни одна программа не может через него пройти. Остальное считают как обычно: ноль просто ничего не добавляет к сумме.

В 10 и 11 из 6 можно попасть только через 9, поэтому там тоже 0. А в 12 можно перепрыгнуть 9 умножением: 6 · 2 = 12. Значит, K(12) = 1, и дальше счёт продолжается.

nСлагаемыеK(n)
6старт1
7, 8только «+1»1
9запрещено0
10, 11только через 90
12K(11) + K(6)1
13K(12)1
14K(13) + K(7)2
15K(14)2
16K(15) + K(8)3
17K(16)3
18K(17) + K(9)3
19K(18)3
20K(19) + K(10)3

Ответ задачи темы

Итак, сколько программ в задаче темы?

Запрет учитывают на каждом участке, а участки перемножают: 3 · 3 = 9 — ответ задачи темы. На первом участке 9 не встречается: оно больше 6.

Задача темы по участкам: на 2 → 6 три программы; на 6 → 20 счёт заново с 1, зачёркнутое 9 получает 0, и до 20 доходят три.
Вручную

Три программы второго участка можно выписать:

  • 6 · 2 = 12, затем «+1» до 20;
  • 6 + 1 = 7, 7 · 2 = 14, затем «+1» до 20;
  • 6 → 7 → 8, 8 · 2 = 16, затем «+1» до 20.

Проверка вычитанием: через 6 всего 18 программ, через 6 и 9 — 3 · 1 · 3 = 9 (участки 2 → 6, 6 → 9, 9 → 20), значит, без 9 — 18 − 9 = 9.

Python

Запрет — это ещё одна проверка в начале функции: если x равно 9, программ нет — условия соединяем через . А обязательное число — два вызова, перемноженные между собой:

def f(x, y):    if x == 9 or x > y:        return 0    if x == y:        return 1    return f(x + 1, y) + f(x * 2, y)  print(f(2, 6) * f(6, 20))
9

Проверку запрета ставят перед проверкой цели: иначе запрещённая цель засчиталась бы как успех.

Несколько условий

Что делать, если обязательных чисел два — например, 4 и 8 на пути из 2 в 16?

Каждое обязательное число — ещё один разрез пути. Участков становится больше, а запрет обнуляет своё число на том участке, где оно встречается. Команды только увеличивают число, поэтому порядок 2 → 4 → 8 → 16: 2 · 2 · 2 = 8 программ.

Тонкости:запрет по свойству числа

Запрет может быть задан свойством: «траектория не содержит чисел, оканчивающихся на 7». На пути из 2 в 20 обнуляют и 7, и 17 — остаётся 6 программ из 30. Последняя цифра числа — остаток от деления на 10: x % 10 == 7.

Если запрещённое число совпадает с обязательным или с целью, программ нет: ответ 0.

Итого

  • Обязательноепроизведение участков
  • Новый участокзаново с единицы
  • Запрещённое0 в таблице, перепрыгнуть можно
  • Задача темы3 · 3 = 9
  • Проверкавсе через 6 минус через 6 и 9
  • Pythonf(2, 6) * f(6, 20)

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
Команды «+1» и «×2». Сколько программ переводят 2 в 12 через 6?
ОтветСкрыть ответ
Ответ
6: из 2 в 6 три программы, из 6 в 12 две, 3 · 2.
Вопрос 2
А сколько программ переводят 2 в 12 без 6?
ОтветСкрыть ответ
Ответ
4: всего 10, через 6 — 6, без 6 — 10 − 6.
Вопрос 3
Сколько программ переводят 2 в 16, если траектория содержит 4 и 8?
ОтветСкрыть ответ
Ответ
8: 2 · 2 · 2 — участки 2 → 4, 4 → 8, 8 → 16.
Вопрос 4
Почему количества участков перемножают, а не складывают?
ОтветСкрыть ответ
Ответ
Программе нужны обе части: каждая первая часть сочетается с каждой второй.
Вопрос 5
Число 9 запрещено. Можно ли выполнить «×2» из 8 и получить 16?
ОтветСкрыть ответ
Ответ
Да: запрет касается результатов команд, а 9 этот переход перепрыгивает.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Команды «+1» и «×2». Сколько программ переводят 2 в 12, если траектория содержит 5?

Введите число.

Команды «+1» и «×2». Сколько программ переводят 2 в 12, если траектория не содержит 5?

Введите число.

Команды «+1» и «×2». Сколько программ переводят 2 в 16, если траектория содержит 6 и не содержит 9?

Введите число.

Из 1 в 20 через 10

Исполнитель преобразует число на экране. У исполнителя есть две команды: 1. Прибавить 1; 2. Умножить на 2. Сколько существует программ, для которых при исходном числе 1 результатом является число 20, и при этом траектория вычислений содержит число 10 и не содержит числа 15?

Введите число.

Из 3 в 30 через 12 без 20

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

Введите число.

Из 2 в 40 через 10 без 25

Команды «+1» и «×2». Сколько программ переводят 2 в 40, если траектория содержит 10 и не содержит 25?

Введите число.

Порядок проверок

В функции, которая должна считать программы без числа 6, проверки поставили в таком порядке. Что выведет программа?

def g(x, y):    if x == y:        return 1    if x == 6 or x > y:        return 0    return g(x + 1, y) + g(x * 2, y)  print(g(2, 6))

Введите число.

Команды «+1» и «×2». Сколько программ переводят 2 в 16, если траектория содержит и 4, и 8?

Введите число.

Без чисел, оканчивающихся на 7

Команды «+1» и «×2». Сколько программ переводят 2 в 20, если траектория не содержит чисел, оканчивающихся на 7?

Введите число.