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

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

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

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

Задача 1#59467

Илья составляет слова перестановкой букв в слове ЕДИНОБОРСТВА. Сколько слов, в середине (то есть не начинается с первой позиции и не заканчивается последней) которых находится слово НОСБ, а в начале стоит гласная буква, может составить Илья?

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

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

Рассмотрим различные расположения слова НОСБ: *НОСБ*******, **НОСБ******, ***НОСБ*****, ****НОСБ****, *****НОСБ***, ******НОСБ**, *******НОСБ*. Так как на первой позиции может стоять только гласная, а одна буква О находится в слове НОСБ, то всего букв на первой позиции может стоять 4.

Тогда, например, для *НОСБ******* всего слов будет: 4 ⋅1⋅2⋅1 ⋅1⋅7⋅6 ⋅5⋅4⋅3 ⋅2⋅1 = 40320  . Так как всего вариантов перестановок может быть 7, то умножаем это число на 7: 40320 ⋅7 = 282240  . Так как в слове встречается две буквы О, то чтобы исключить повторения, нужно еще разделить это число на 2: 282240
---2-- = 141120

Решение через циклы
Составляем программу для перебора всех слов из оставшихся 8 букв, полученных удалением сочетания НОСБ из изначального слова. Первая буква выбирается только из гласных (Е, И, О, А). Проверяем, что буквы не повторяются, используя множество (его длина должна совпадать с длиной слова, тогда нет повторяющихся букв). Каждое слово добавляем в множество count  , чтобы убрать дубликаты. Поскольку слово НОСБ может стоять в середине на 7 разных позициях, итоговый результат умножаем на 7.

# оставляем буквы слова "ЕДИНОБОРСТВА", исключив НОСБ,
# так как оно фиксировано
a = "ЕДИОРТВА"
count = set()  # множество для уникальных слов
for x1 in "ЕИОА":  # первая буква - гласная
    for x2 in a:
        for x3 in a:
            for x4 in a:
                for x5 in a:
                    for x6 in a:
                        for x7 in a:
                            for x8 in a:
                                s = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8

                                # по условию у нас перестановки,
                                # то есть каждая буква используется 1 раз
                                if len(set(s)) == len(s):
                                    count.add(s)

# умножаем на 7, потому что НОСБ можно расположить на 7 позиций
print(len(count) * 7)

Решение через itertools
С помощью permutations строим все перестановки оставшихся 8 букв. Проверяем, что первая буква – одна из гласных. Если условие выполнено, добавляем строку в множество. После перебора берём размер множества и умножаем на 7 (так как сочетание НОСБ может занимать 7 различных позиций).

from itertools import permutations

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

# составляем перестановки оставшихся букв
for x in permutations("ЕДИОРТВА"):
    s = "".join(x)

    # проверяем, что первая буква гласная
    if s[0] in "ЕИОА":
        count.add(s)

# умножаем на 7, это количество перестановок для НОСБ
print(len(count) * 7)

Ответ: 141120

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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