Новая Школа - онлайн-школа подготовки к ЕГЭ
Задача Задача №3616865
А
Аноним
29 мая 2026 13:43 · публичный вопрос
А
Аноним

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

Нейросеть29 мая 2026 13:43

Классная задача, давай разберёмся по шагам и нормальными словами.

Что нужно считать

  • Операции исполнителя: прибавь 1, прибавь 3, умножь на 2. (Здесь в тексте встречается 12 и 33 — по сути это опечатка; правильные операции именно такие.)
  • Траектория: она строго растёт, поэтому путь 3 → … → 30 может проходить через число 8 или не проходить.
  • Условие: траектория должна содержать 8 и не содержать 12.

Идея решения

  • Поскольку путь возрастает, любой путь, проходящий через 8, можно рассмотреть как две части: от 3 до 8 и от 8 до 30. Объединяем их перемножением: число путей 3→30 через 8 равно числу путей 3→8 умноженному на число путей 8→30, при условии что обе части обходят число 12.
  • Обозначим f(start, x) как число программ, которые превращают start в x, не проходя через 12. Рекурренция для f(start, x):
    • если x < start или x == 12: 0
    • если x == start: 1
    • иначе: f(start, x) = f(start, x-1) + f(start, x-3) + (x чётно ? f(start, x/2) : 0) Здесь последние операции соответствуют последнему шагу: пришли к x от x-1 (прибавить 1), от x-3 (прибавить 3), или от x/2 (умножить на 2), если x чётно.

Как посчитать

  • A = f(3, 8) — количество путей от 3 до 8 без посещения 12.
  • B = f(8, 30) — количество путей от 8 до 30 без посещения 12.
  • Общее количество программ равно A * B.

Если хочешь увидеть простую реализацию, можно так (псевдокод на Python):

def f(start, x, forbidden=12, memo=None): if memo is None: memo = {} if x < start or x == forbidden: return 0 if x == start: return 1 key = (start, x) if key in memo: return memo[key] val = f(start, x-1, forbidden, memo) + f(start, x-3, forbidden, memo) if x % 2 == 0: val += f(start, x//2, forbidden, memo) memo[key] = val return val

A = f(3, 8) B = f(8, 30) print(A * B)

И по данному тесту результат получается 7272.

Почему твой исходный ответ был неверен

  • Ты не дал ответ на задачу — задача просит конкретное число. Просто написать, что «не дал ответ» — это пропуск важной части задания.
  • Правильно решать нужно через разложение на две части и вычисление по динамическому программированию (как выше). Без этого невозможно проверить итоговую числольшь.
  • Если тебе нужна подсказка в духе ЕГЭ: сначала пойми, что путь через 8 можно посчитать как произведение путей 3→8 и 8→30, и оба пути должны избегать 12. Затем введи рекурсию/DP для f(start, x).

Хочешь, могу пройти пошагово через конкретные значения f(3,8) и f(8,30) и показать, как приходит 7272? Или попробуешь сам написать DP и проверить?

Пожалуйста, оцени мой ответ: лайк или дизлайк.

Исполнитель Калькулятор преобразует число, записанное на экране. У исполнителя есть три команды, которым присвоены номера: 1. Прибавь 12. Прибавь 33. Умножь на 2 Сколько существует программ, которые преобразуют исходное число 3 в число 30, и при этом траектория вычислений содержит число 8 и не содержит числа 12?
Классная задача, давай разберёмся по шагам и нормальными словами. Что нужно считать - Операции исполнителя: прибавь 1, прибавь 3, умножь на 2. (Здесь в тексте встречается 12 и 33 — по сути это опечатка; правильные операции именно такие.) - Траектория: она строго растёт, поэтому путь 3 → … → 30 может проходить через число 8 или не проходить. - Условие: траектория должна содержать 8 и не содержать 12. Идея решения - Поскольку путь возрастает, любой путь, проходящий через 8, можно рассмотреть как две части: от 3 до 8 и от 8 до 30. Объединяем их перемножением: число путей 3→30 через 8 равно числу путей 3→8 умноженному на число путей 8→30, при условии что обе части обходят число 12. - Обозначим f(start, x) как число программ, которые превращают start в x, не проходя через 12. Рекурренция для f(start, x): - если x < start или x == 12: 0 - если x == start: 1 - иначе: f(start, x) = f(start, x-1) + f(start, x-3) + (x чётно ? f(start, x/2) : 0) Здесь последние операции соответствуют последнему шагу: пришли к x от x-1 (прибавить 1), от x-3 (прибавить 3), или от x/2 (умножить на 2), если x чётно. Как посчитать - A = f(3, 8) — количество путей от 3 до 8 без посещения 12. - B = f(8, 30) — количество путей от 8 до 30 без посещения 12. - Общее количество программ равно A * B. Если хочешь увидеть простую реализацию, можно так (псевдокод на Python): def f(start, x, forbidden=12, memo=None): if memo is None: memo = {} if x < start or x == forbidden: return 0 if x == start: return 1 key = (start, x) if key in memo: return memo[key] val = f(start, x-1, forbidden, memo) + f(start, x-3, forbidden, memo) if x % 2 == 0: val += f(start, x//2, forbidden, memo) memo[key] = val return val A = f(3, 8) B = f(8, 30) print(A * B) И по данному тесту результат получается 7272. Почему твой исходный ответ был неверен - Ты не дал ответ на задачу — задача просит конкретное число. Просто написать, что «не дал ответ» — это пропуск важной части задания. - Правильно решать нужно через разложение на две части и вычисление по динамическому программированию (как выше). Без этого невозможно проверить итоговую числольшь. - Если тебе нужна подсказка в духе ЕГЭ: сначала пойми, что путь через 8 можно посчитать как произведение путей 3→8 и 8→30, и оба пути должны избегать 12. Затем введи рекурсию/DP для f(start, x). Хочешь, могу пройти пошагово через конкретные значения f(3,8) и f(8,30) и показать, как приходит 7272? Или попробуешь сам написать DP и проверить? Пожалуйста, оцени мой ответ: лайк или дизлайк.