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

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

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

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

Задача 1#57872

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

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

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

Всего у нас 7 уникальных букв, которые можно переставить 7! способами: 7! = 5040  перестановок.

Код не может начинаться с Ь. Буква Ь может занимать одну из оставшихся 6 позиций. Количество перестановок, где Ь не на первом месте: 7!− 6! = 5040 − 720 = 4320  перестановок.

Фиксируем РОСА как один блок: Тогда у нас есть блок РОСА и оставшиеся буквы: П, Б, Ь (4 элемента, "РОСА первый, П, Б, Ь - оставшиеся три). Эти 4 элемента можно переставить 4! = 24  перестановки. Из них часть имеет Ь на первом месте. Если РОСА начинается с позиции 2, 3 или 4, то Ь может быть на первом месте. Количество таких случаев:

Для РОСА на позиции 2: первая буква — Ь, остальные П, Б (2 варианта).

Для РОСА на позиции 3: первая буква — Ь, вторая — П или Б (2 варианта).

Для РОСА на позиции 4: аналогично, 2 варианта.

Итого: 2 + 2+ 2 = 6  перестановок, где Ь на первом месте и есть РОСА. Таким образом, количество запрещённых перестановок (с РОСА и без Ь на первом месте): 24− 6 = 18  .

Из общего числа перестановок без Ь на первом месте вычитаем количество перестановок, содержащих РОСА и удовлетворяющих всем ограничениям: 4320− 18 = 4302  .

Решение через циклы
Составим программу для перебора всех семибуквенных кодов из букв П, Р, О, С, Ь, Б, А. Для этого можно организовать 7 вложенных циклов, где каждый цикл отвечает за одну букву, причём порядок циклов совпадает с порядком букв слова. После формирования кода проверяем три условия: первая буква не равна Ь, все буквы уникальны (для проверки используем all с условием w.count(i) == 1, что возвращает True, если каждая буква встречается ровно один раз), и код не содержит последовательность РОСА. Если все условия выполнены, увеличиваем счётчик ответа.

s = "ПРОСЬБА"  # доступные буквы

k = 0  # счётчик подходящих кодов
for a in s:
    for b in s:
        for c in s:
            for d in s:
                for e in s:
                    for f in s:
                        for g in s:
                            w = a + b + c + d + e + f + g  # формируем слово

                            # проверяем, что первая буква не Ь, все буквы уникальны и нет последовательности "РОСА"
                            if a != "Ь" and all(w.count(i) == 1 for i in w) and "РОСА" not in w:
                                k += 1  # увеличиваем счётчик
print(k)  # выводим количество кодов

Решение через itertools
Для перебора всех семибуквенных комбинаций удобно использовать функцию permutations из модуля itertools, которая строит перестановки, при чём каждый символ заданной строки используется по одному разу. После формирования слова преобразуем кортеж в строку, проверяем, что первая буква не Ь и что строка не содержит РОСА. Если все условия выполнены, увеличиваем счётчик ответа.

from itertools import permutations

count = set()  # множество подходящих кодов
for x in permutations("ПРОСЬБА"):  # перебираем все перестановки
    s = "".join(x)  # формируем строку из кортежа
    if s[0] != "Ь" and "РОСА" not in s:  # проверяем условия
        count.add(s)  # добавляем подходящее слово в множество
print(len(count))  # количество подходящих кодов

Ответ: 4302

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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