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

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

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

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

Задача 1#50789

Из букв слова Р,Е,С,Т,О,Р,А,Н, составляются 8-буквенные последовательности. Сколько можно составить различных последовательностей таких, что каждая буква используется столько же раз, сколько она встречается в слове РЕСТОРАН и они не содержат сочетание букв АТ?

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

Всего существует 8-⋅7⋅6⋅5-⋅4⋅3⋅2-⋅1= 8!=  40320-= 20160
        2!          2!     2  последовательностей (поделили на 2!, так как буква Р используется в слове два раза, поэтому так мы исключаем повторения)

Найдем количество последовательнотсей с сочетанием букв АТ:

1. А Т * * * * * *

2. * А Т * * * * *

3. * * А Т * * * *

4. * * * A T * * *

5. * * * * A T * *

6. * * * * * A T *

7. * * * * * * A T

Получается есть 7 вариантов перестановок букв АТ, для каждого варианта постановки АТ существует
1 ⋅1⋅6⋅5 ⋅4⋅3⋅2 ⋅1 = 720  последовательностей, но не забываем поделить на 2!, чтобы исключить повторения из-за двух букв Р, значит 720/2 = 360 последовательностей.

Тогда существует 360 ⋅7 = 2520  последовательностей, которые содержат сочетание АТ.

Значит для вычисления итогового ответа достаточно вычесть из всех последовательностей последовательности с сочетанием букв АТ:
20160 - 2520 = 17640 последовательностей без сочетания букв АТ.


Решение программой (циклы):
Перебираем все 8-буквенные слова, составленные из букв слова РЕСТОРАН, где каждая буква встречается столько раз, сколько в исходном слове. Для каждого слова проверяем условия: оно не содержит подстроку АТ (используем оператор in) и количество каждой буквы совпадает с количеством в исходном слове. Для проверки второго условия используем флаг, который обнуляется при нарушении условий. Далее проходимся по каждой букве и с помощью метода count проверяем, что количество совпадает с количеством в исходном слове. Если слово подходит, добавляем его в множество, чтобы исключить повторения. В конце выводим количество подходящих последовательностей.

word = "РЕСТОРАН"  # Исходное слово
alf = set("РЕСТОРАН")  # Уникальные буквы
ans = set()  # Множество для хранения неповторяющихся слов

# Генерация всех 8-буквенных слов через вложенные циклы
for x1 in alf:  # 1-я буква
    for x2 in alf:  # 2-я буква
        for x3 in alf:  # 3-я буква
            for x4 in alf:  # 4-я буква
                for x5 in alf:  # 5-я буква
                    for x6 in alf:  # 6-я буква
                        for x7 in alf:  # 7-я буква
                            for x8 in alf:  # 8-я буква
                                w = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8
                                if "АТ" not in w:  # Проверяем отсутствие подстроки АТ
                                    f = 1  # Флаг. 1 = слово подходит, 0 = не подходит
                                    for i in w:  # Проверяем совпадение количества букв
                                        if w.count(i) != word.count(i):
                                            f = 0  # Слово не подходит
                                            break
                                    if f:  # Если все условия выполнены
                                        ans.add(w)  # Запоминаем подходящее слово
print(len(ans))  # Выводим количество уникальных слов

Решение программой (itertools):
Для решения задачи с помощью модуля itertools используем функцию product, которая генерирует все 8-буквенные комбинации из букв множества РЕСТОРАН. Каждое слово проверяется на отсутствие подстроки АТ и на совпадение количества букв с исходным словом. Проверки выполняются аналогично решению с вложенными циклами. Если слово подходит, добавляем его в множество, чтобы исключить повторения. В конце выводим количество подходящих последовательностей.

from itertools import product

word = "РЕСТОРАН"  # Исходное слово
alf = set("РЕСТОРАН")  # Уникальные буквы
ans = set()  # Множество для неповторяющихся слов

# Перебор всех 8-буквенных комбинаций из букв множества "РЕСТОРАН"
for w in product(alf, repeat=8):
    w = "".join(w)  # Собираем строку из кортежа
    if "АТ" not in w:  # Проверяем отсутствие подстроки "АТ"
        f = 1  # Флаг. 1 = слово подходит, 0 = не подходит
        for i in w:  # Проверяем совпадение количества букв
            if w.count(i) != word.count(i):
                f = 0  # Слово не подходит
                break
        if f:  # Если все условия выполнены
            ans.add(w)  # Запоминаем подходящее слово
print(len(ans))  # Выводим количество уникальных слов

Ответ: 17640

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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