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

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

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

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

Задача 1#84844

Арсений составляет 7-буквенные слова перестановкой букв слова ОКТЯБРЬ. При этом в слове не могут стоять рядом буквы О и Я, а буква Ь не может стоять на первом или последнем месте. Словом считается любая допустимая последовательность букв, не обязательно осмысленная. Сколько слов может составить Арсений?

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

Решение руками

1. Общее количество перестановок с учётом ограничения на Ь:

Буква Ь не может стоять на первом или последнем месте. То есть для Ь доступны только позиции 2, 3, 4, 5, 6 (всего 5 вариантов). Остальные 6 букв можно расставить на оставшиеся 6 позиций произвольно. Таким образом, получаем 5 ∗6! = 3600  слов.

2. Подсчет слов с ОЯ или ЯО:

Заменим сочетание ОЯ или ЯО одной буквой - Y. Тогда набор букв: Y, К, Т, Р, Б, Ь и длина слова - 6. Ь нельзя разместить на первом или последнем месте, значит для него доступно 4 варианта. Остальные 5 букв можно расставить на оставшиеся 5 позиций произвольно. Таким образом, получаем 4∗ 5! = 480  . Учтем, что Y означает две комбинации букв: 480 ∗2 = 960  .

3. Тогда подходящих под условие слов: 3600 − 960 = 2640  .

Решение через циклы:

Для решения задачи через циклы мы будем формировать все возможные 7-буквенные слова, которые являются перестановками букв слова "ОКТЯБРЬ". Каждая позиция слова соответствует отдельному циклу for, где выбирается одна буква.

Сначала создаём строку a = ’ОКТЯБРЬ’ для всех букв и строку a1 = ’ОКТЯБР’ для первой и последней позиции, так как буква ’Ь’ не может стоять на этих местах. Создаём пустое множество count = set() для хранения уникальных слов.

Далее используем 7 вложенных циклов for:

1. for x1 in a1 — выбираем первую букву слова (не ’Ь’).

2. for x2 in a, ..., for x6 in a — выбираем буквы со 2-й по 6-ю позицию (любые буквы).

3. for x7 in a1 — выбираем последнюю букву слова (не ’Ь’).

Внутри циклов формируем строку s = x1+x2+x3+x4+x5+x6+x7.

Затем проверяем условия задачи:

- Буквы ’О’ и ’Я’ не стоят рядом: ’ОЯ’ not in s and ’ЯО’ not in s. - Все буквы различны: len(set(s)) == len(s).

Если оба условия выполнены, добавляем слово в множество count. После завершения перебора всех комбинаций выводим размер множества len(count) — это количество допустимых слов.

# Строка с буквами исходного слова
a = ’ОКТЯБРЬ’

# Строка для первой и последней позиции (без буквы ’Ь’)
a1 = ’ОКТЯБР’

# Множество для хранения уникальных слов
count = set()

# Перебор буквы на первой позиции (не ’Ь’)
for x1 in a1:
    # Перебор буквы на второй позиции
    for x2 in a:
        # Перебор буквы на третьей позиции
        for x3 in a:
            # Перебор буквы на четвёртой позиции
            for x4 in a:
                # Перебор буквы на пятой позиции
                for x5 in a:
                    # Перебор буквы на шестой позиции
                    for x6 in a:
                        # Перебор буквы на последней позиции (не ’Ь’)
                        for x7 in a1:
                            # Формируем текущее слово
                            s = x1+x2+x3+x4+x5+x6+x7
                            # Проверяем условия:
                            # 1. Буквы ’О’ и ’Я’ не стоят рядом
                            # 2. Все буквы различны
                            if ’ОЯ’ not in s and ’ЯО’ not in s and len(set(s)) == len(s):
                                # Добавляем слово в множество
                                count.add(s)
# Выводим количество допустимых слов
print(len(count))

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

Для решения с помощью модуля itertools используем функцию permutations, которая генерирует все перестановки без повторений из букв слова "ОКТЯБРЬ".

1. Перебираем каждую перестановку x и преобразуем её в строку s = ’’.join(x).

2. Проверяем, что буква ’Ь’ не стоит на первой и последней позиции: s[0] != ’Ь’ and s[-1] != ’Ь’.

3. Проверяем, что буквы ’О’ и ’Я’ не стоят рядом: ’ОЯ’ not in s and ’ЯО’ not in s.

4. Если условия выполнены, увеличиваем счётчик count на 1.

В конце выводим count — это количество допустимых слов.

from itertools import permutations

# Счётчик допустимых слов
count = 0

# Перебор всех перестановок букв слова ’ОКТЯБРЬ’
for x in permutations(’ОКТЯБРЬ’):
    # Преобразуем кортеж в строку
    s = ’’.join(x)
    # Проверяем условия:
    # 1. Буква ’Ь’ не на первой и последней позиции
    # 2. Буквы ’О’ и ’Я’ не стоят рядом
    if s[0] != ’Ь’ and s[-1] != ’Ь’ and (’ОЯ’ not in s) and (’ЯО’ not in s):
        # Увеличиваем счётчик допустимых слов
        count += 1

# Выводим результат
print(count)

Ответ: 2640

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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