К содержанию

Подтема 6 из 7 · дополнительный урок

Группы программ и обратные вопросы

Условия на несколько чисел сразу, подсчёт без таблицы и обратный вопрос: какая цель даёт нужное число программ.

Несколько чисел сразу

Дополнительный урок — для продвинутых: такие условия редки.

Сколько программ из 2 в 6 командами «+1» и «×2» проходят через 3 и 4? Через хотя бы одно из них? Через ровно одно?

Когда условие говорит о нескольких числах сразу, программы делят на группы и следят, какие из них посчитаны дважды. Из 2 в 6 ведут три программы из подтемы 1: 1111 проходит через 3 и 4, 12 — только через 3, 211 — только через 4.

И, или, ровно одно

«И» — программы через оба числа, «или» — хотя бы через одно, «ровно одно» — через одно, но не через оба.

УсловиеПрограммыВсего
через 3 и 411111
через 3 или 41111, 12, 2113
ровно через одно12, 2112
Вручную

Через 3 — две программы, через 4 — две, через оба — одна. Сумма 2 + 2 учитывает 1111 дважды, поэтому «или» — 2 + 2 − 1 = 3. Для «ровно одно» 1111 убирают из обеих групп: 2 + 2 − 2 · 1 = 2.

Python
def f(x, y):    if x > y:        return 0    if x == y:        return 1    return f(x + 1, y) + f(x * 2, y)  a = f(2, 3) * f(3, 6)b = f(2, 4) * f(4, 6)both = f(2, 3) * f(3, 4) * f(4, 6)print(a + b - both, a + b - 2 * both)
3 2
Тонкости:«или» и общий запрет

Если к «или» добавлен общий запрет — «через 6 или через 8, но не через 15», — запрет ставят в каждое из трёх слагаемых: считают через 6, через 8 и через оба с нулём в 15. Вычесть программы через 15 один раз из готовой суммы нельзя: часть из них уже учтена дважды.

Только прибавления

Команды «+1» и «+3». Сколько программ переводят 2 в 11?

Если все команды — прибавления, программу задают число команд каждого вида и их места: перебирают количества и считают расстановки. Прибавить нужно 9: если «+3» выполнено b раз, то «+1» — 9 − 3b раз.

«+3»«+1»КомандРасстановок
0991
1677
23510
3031

Одну «+3» среди семи команд можно поставить на любое из 7 мест. Две «+3» среди пяти — на пару мест: 5 · 4 = 20 упорядоченных выборов, но каждая пара посчитана дважды, остаётся 10. Итого 1 + 7 + 10 + 1 = 19. Проверка таблицей K(n) = K(n − 1) + K(n − 3) от 2 до 11: 1, 1, 1, 2, 3, 4, 6, 9, 13, 19.

Тонкости:когда способ не работает

Число способов выбрать k мест из n — число сочетаний n! / (k! · (n − k)!), где n! — произведение чисел от 1 до n. Для пары мест из пяти: 5! / (2! · 3!) = 10.

Расстановки годятся, только пока порядок команд не меняет допустимость: при запрещённом числе или с умножением («+1», затем «×2» и наоборот дают разные числа) считают таблицей.

Обратный вопрос

Команды «+1» и «×2», старт 2. Какое наименьшее число получается ровно 18 программами?

В обратном вопросе таблицу считают по всему диапазону и только потом выбирают цели с нужным количеством. Нечётное число получает столько же программ, сколько предыдущее, — поэтому значения идут парами.

Вручную
nK(n)
12, 1310
14, 1513
16, 1718
18, 1923
20, 2130

18 программ — у 16 и 17. Наименьшая цель — 16, а если спрашивают все цели, ответ — оба числа.

Python
k = [0] * 22k[2] = 1for n in range(3, 22):    k[n] = k[n - 1]    if n % 2 == 0:        k[n] += k[n // 2]print([n for n in range(2, 22) if k[n] == 18])
[16, 17]
Тонкости:останавливаться рано

С командой «+1» и без запретов количества не убывают, и первое совпадение — наименьшая цель. С запретом или без «+1» количество может упасть до нуля и снова вырасти, поэтому таблицу досчитывают до конца диапазона.

Не оба

Команды «+1» и «×2». Сколько программ из 2 в 12 не проходят через 4 и 8 одновременно?

«Не оба» — все программы минус программы через оба числа. Всего программ 10, через 4 и 8 — 2 · 2 · 1 = 4 (участки 2 → 4, 4 → 8, 8 → 12). Ответ 10 − 4 = 6.

УсловиеКак считатьПрограмм
через 4 и 8участки 2 → 4 → 8 → 124
хотя бы через одно8 + 5 − 49
ровно через одно8 + 5 − 2 · 45
не через оба10 − 46

Четыре условия — четыре разные группы, и ответы у них разные. Перед счётом переведи условие в одну из этих строк.

Итого

  • Ипроизведение участков через оба числа
  • Илисумма групп минус пересечение
  • Ровно односумма минус два пересечения
  • Не обавсе минус пересечение
  • Только прибавленияколичества команд и их расстановки
  • Обратный вопростаблица по всему диапазону, потом выбор

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

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

Вопрос 1
Команды «+1» и «×2», путь 2 → 6. Сколько программ проходят через оба числа 3 и 4?
ОтветСкрыть ответ
Ответ
1: только 1111.
Вопрос 2
А через ровно одно из чисел 3 и 4?
ОтветСкрыть ответ
Ответ
2: через 3 — две программы, через 4 — две, общая одна: 2 + 2 − 2 · 1.
Вопрос 3
Команды «+1» и «+3». Сколько программ переводят 2 в 11?
ОтветСкрыть ответ
Ответ
19: 1 + 7 + 10 + 1 по числу команд «+3» — от 0 до 3.
Вопрос 4
Команды «+1» и «×2», старт 2. Какая наименьшая цель, до которой ведут ровно 18 программ?
ОтветСкрыть ответ
Ответ
16: таблица до 21 даёт 18 программ в 16 и 17.

Практика

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

Хотя бы одно из двух

Команды «+1» и «×2», путь 2 → 6. Сколько программ проходят хотя бы через одно из чисел 3 и 4?

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

Прибавления: из 2 в 11

Команды «+1» и «+3». Сколько программ переводят 2 в 11? Реши таблицей и выбором позиций команд.

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

Прибавления: из 1 в 15

Команды «+1» и «+3». Сколько программ переводят 1 в 15? Реши выбором мест для команд «+3» и проверь таблицей.

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

Наименьшая цель с 20 программами

Команды «+1» и «×2», старт 1. Найди наименьшую цель, до которой ведут ровно 20 программ.

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

Не оба сразу

Команды «+1» и «×2», путь 2 → 12. Сколько программ не проходят одновременно через 4 и 8?

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

Через 6 или 8 без 15

Команды «+1» и «×2», путь 2 → 20. Сколько программ проходят через 6 или через 8 и при этом не проходят через 15?

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