Тема 8. Комбинаторика

8.02 Подсчет количества слов/чисел

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

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

Задача 1#85467

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

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

Так как нам нужны палиндромы длины 6, можем составлять только слова длины 3 и мысленно их отзеркаливать, так и будут получаться палиндромы.

Слова без Й могут быть любыми, слова с И подчиняются определенным правилам:

*** -> ****** - подходит: 64 ⋅64 ⋅64

**Й -> **ЙЙ** - подходит: 64⋅64⋅2

*Й* -> *Й**Й* - не подходит

Й** -> Й****Й - не подходит

*ЙЙ -> *ЙЙЙЙ* - подходит: 64 ⋅2⋅2

Й*Й -> Й*ЙЙ*Й - не подходит

ЙЙ* -> ЙЙ**ЙЙ - подходит: 2 ⋅2⋅64

ЙЙЙ -> ЙЙЙЙЙЙ - подходит: 2⋅2 ⋅2

Если сложим все эти выражения, получим ответ: 270856  .

Идея решения через itertools:

Мы разбиваем задачу на части с учётом свойства палиндрома и ограничения для буквы "Й".

1. Так как слово палиндром длиной 6, нам достаточно сформировать первые 3 буквы. Последние 3 буквы будут зеркальным отражением первых 3 букв. Это уменьшает количество перебираемых комбинаций и упрощает проверку условий.

2. Алфавит включает все буквы русского языка в верхнем и нижнем регистре. Мы объединяем верхний и нижний регистр в одну строку для генерации комбинаций.

3. Для каждой комбинации первых трёх букв проверяем условие для буквы "Й":

     - если в слове есть только одна Й, она должна находиться на последнем месте первой половины (чтобы после зеркалирования она была рядом с другой "Й"),

     - если две Й, они должны быть рядом (чтобы в палиндроме не нарушалось правило),

     - комбинации с неподходящим расположением "Й"отбрасываются.

4. Все подходящие комбинации добавляются в множество для учёта уникальных слов.

Решение через itertools:

from itertools import product # Импортируем функцию product для генерации комбинаций

# Алфавит в верхнем регистре
s = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
# Добавляем также алфавит в нижнем регистре
s = s + s.lower()
ans = set() # Множество для хранения уникальных палиндромов

# Палиндром длиной 6 - достаточно сгенерировать первые 3 буквы
for i in product(s, repeat=3):
    word_ = "".join(i) # Преобразуем кортеж в строку первых 3 букв
    word = word_.upper() # Работаем с верхним регистром для проверки "Й"
    # Пропускаем неподходящие слова с буквой "Й"
    # Условие: одна "Й" не на последнем месте или две "Й" не рядом
    if "Й" in word:
        if word.count("Й") == 1 and word[-1] != "Й" or word.count("Й") == 2 and word[1] != "Й":
            continue
    ans.add(word_) # Добавляем допустимую комбинацию в множество

print(len(ans)) # Выводим количество уникальных палиндромов

Ответ: 270856

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

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

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

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

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

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

Бесплатное онлайн-обучение

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

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

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

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

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

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

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

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