Тема 12. Сложные исполнители и алгоритмы
12.02 Исполнитель «Редактор»
Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела сложные исполнители и алгоритмы
Решаем задачу:

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

Задача 1#63514

Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки символов.

1. заменить (v, w)

2. нашлось (v)

Первая команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Если цепочки v в строке нет, эта команда не изменяет строку. Вторая команда проверяет, встречается ли цепочка v в строке исполнителя Редактор.

Дана программа для исполнителя Редактор:

НАЧАЛО

   ПОКА НЕ нашлось (00)

      заменить (02, 101)

      заменить (11, 2)

      заменить (012, 30)

      заменить (010, 00)

   КОНЕЦ ПОКА

КОНЕЦ

Известно, что исходная строка содержала ровно два нуля – на первом и на последнем месте, 50 двоек, больше 100 единиц и не содержала других цифр. После выполнения программы получилась строка, сумма цифр которой оказалась простым числом. Какое наименьшее количество единиц могло быть в исходной строке?

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

Решение 1

Распишем все переходы для пар из единиц и двоек.

  1. 011 → 02 → 101
  2. 012 → 30
  3. 021 → 1011 → 102 → 1101
  4. 022 → 1012 → 130

Задача у нас про сумму цифр, как видим сумма при переходе пар константна.

Рассмотрим переходы одиночных цифр между нулями.

  1. 010 → 00
  2. 020 → 1010 → 100

Как видим, сумма оба раза уменьшилась на единицу. Получается, что если изначальная сумма была s  , то сумма после работы алгоритма будет s − 1  . Начальная сумма цифр 50⋅2 + 1⋅100 = 200  . Нам необходимо количество единиц   > 100  . Минимальное простое число большее 200  — это 211  , учтем единицу, которую вычитали, получаем 212  — начальная сумма цифр и 112  — количество единиц.

Решение 2

def is_prime(n):
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return n > 1

for n in range(101, 1000):
    s = "0" + ’2’ * 50 + ’1’ * n + ’0’
    while not (’00’ in s):
        s = s.replace(’02’, ’101’, 1)\
            .replace(’11’, ’2’, 1)\
            .replace(’012’, ’30’, 1)\
            .replace(’010’, ’00’, 1)
    if is_prime(sum(int(x) for x in s)):
        print(n)
        break

Ответ: 112

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное обучение
в Школково

Для детей ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Брянской областей, а также школьникам, находящимся в пунктах временного размещения Крыма обучение на платформе бесплатное.

Налоговые вычеты

Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей

Бесплатный доступ к любому курсу подготовки к ЕГЭ или олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!