Присоединиться

Информатика·Алгоритмы и программирование·9–11 класс

Сколько программ исполнителя «прибавь 1, умножь на 3» переводят число 2 в число 22

Условие

У исполнителя есть ровно две команды: команда «прибавь 1» увеличивает число на экране на единицу, команда «умножь на 3» увеличивает его в три раза. Программа для исполнителя — это непустая последовательность таких команд. Сколько существует различных программ, которые преобразуют число 2 в число 22? Две программы считаются различными, если они отличаются хотя бы одной командой или их порядком; промежуточные результаты могут быть любыми.

Ответ

9 программ

Решение по шагам

  1. Шаг 1. Заводим функцию «сколько программ ведёт в число n»

    Прямой перебор всех последовательностей команд неудобен: программы бывают разной длины. Вместо этого посчитаем задачу «снизу вверх».

    Обозначим через R(n)R(n) количество программ, переводящих стартовое число 2 в число nn.

    База: R(2)=1R(2) = 1 — это «пустая» программа, ничего делать не надо. Такое соглашение удобно: оно не портит ответ, потому что до числа 22 всё равно придётся выполнить хотя бы одну команду.

    Важное наблюдение: обе команды только увеличивают число. Значит, все промежуточные значения лежат между 2 и 22, а до чисел меньше 2 добраться нельзя, поэтому R(n)=0R(n) = 0 при n<2n < 2.

  2. Шаг 2. Выводим рекуррентную формулу

    Посмотрим на последнюю команду программы, которая привела нас в число nn. Вариантов ровно два.

    1. Последней была «прибавь 1». Тогда до неё на экране стояло n1n-1, а способов туда попасть — R(n1)R(n-1).
    2. Последней была «умножь на 3». Это возможно, только если nn делится на 3; тогда до неё на экране стояло n/3n/3, а способов — R(n/3)R(n/3).

    Варианты не пересекаются, поэтому их количества складываются:

    R(n)=R(n1)+{R(n/3),n кратно 3,0,иначе.R(n) = R(n-1) + \begin{cases} R(n/3), & n \text{ кратно } 3,\\ 0, & \text{иначе.}\end{cases}

    Остаётся аккуратно заполнить таблицу от 2 до 22, не забывая, что R(n)=0R(n)=0 для n<2n<2.

Осталось ещё 3 шага — откроются после входа:

  • Шаг 3. Заполняем таблицу от 2 до 12
  • Шаг 4. Доводим таблицу до 22
  • Шаг 5. Проверка «руками»
Получить полное решение

Бесплатно · займёт минуту

Частые ошибки

  • Считают, что R(1)=1R(1) = 1, и получают лишнюю программу в строке n=3n = 3: до единицы с двойки добраться нельзя, значит R(1)=0R(1) = 0.

  • Применяют слагаемое R(n/3)R(n/3) к числам, не кратным трём (например, пишут R(22)=R(21)+R(7,33)R(22) = R(21) + R(7{,}33)).

  • Считают программы «в обратную сторону» и делят на 3 там, где число не делится нацело.

  • Считают одинаковыми программы с теми же командами в разном порядке: «умножь, потом прибавь» и «прибавь, потом умножь» дают разные результаты и считаются разными программами.

  • Ошибочно требуют, чтобы промежуточные числа не превышали 22 «по смыслу задачи», хотя ограничение возникает само: превысив 22, вернуться назад невозможно.

Другие задачи по теме «Алгоритмы и программирование»