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

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

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

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

Задача 1#59469

Артём составляет 5-буквенные слова из букв Л, О, П, У, Х. Каждая буква может встречаться ровно один раз. При этом в слове не могут стоять рядом две гласные буквы, а буква О может только стоять на первом или последнем месте. Словом считается любая допустимая последовательность букв, не обязательно осмысленная. Сколько слов может составить Артём?

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

Решение аналитически

Найдем все слова, в которых О стоит на 1 месте, за ней может стоять только согласная, на остальных трех позициях буквы могут стоять в произвольном порядке, так как гласная осталась всего 1 и она точно не будет соседствовать с другой гласной. Тогда таких слов всего 1⋅3 ⋅3 ⋅2⋅1 = 18  .

В случае когда О стоит на последнем месте, мы просто может развернуть предыдущую комбинацию и получим тоже 18 слов.

Итого, ответ 18+ 18 = 36

Решение программой с помощью циклов

Напишем программу для перебора всевозможных 5-буквенных слов из букв Л, О, П, У, Х. Для этого организуем 5 вложенных циклов (по одному на каждую позицию в слове). Каждый цикл перебирает буквы заданной строки, формируя все возможные комбинации.

После составления очередного слова необходимо его проверить на соответствие условиям:

1. Все буквы уникальны len(set(w)) == 5. set() – это множество, оно хранит только уникальные элементы, поэтому set(w) преобразует слово в множество, удаляя дубликаты. Если длина множества равна 5, значит, все буквы встречаются ровно один раз.

2. Буква О только на первом или последнем месте будем проверять что буквы О нет на остльных позициях. Используем срез строки и проверим позиции 2, 3 и 4 (индексы 1, 2, 3), исключая крайние, на наличие среди них буквы О.

3. Нет соседних гласных ("О"и "У") будем проверять что в составленном слове нет сочетаний ОУ или УО.

Если слово проходит все проверки, счетчик допустимых вариантов увеличивается.

s = "ЛОПУХ" # доступные буквы
k = 0 # счётчик допустимых слов

# Перебор всех возможных 5-буквенных комбинаций
for a in s:
    for b in s:
        for c in s:
            for d in s:
                for e in s:
                    w = a + b + c + d + e # формируем слово
                    # Проверяем условия:
                    # 1. Нет "ОУ" или "УО" (гласные не стоят рядом)
                    # 2. Все буквы уникальны (длина множества = 5)
                    # 3. Буква "О" не в середине (только на 1-й или 5-й позиции)
                    if ("ОУ" not in w and "УО" not in w
                            and len(set(w)) == 5
                                and "О" not in w[1:4]):  # w[1:4] — буквы на позициях 1, 2, 3
                        k += 1 # если условия выполнены, увеличиваем счётчик
print(k) # вывод результата

Решение программой с помощью модуля itertools

Для решения задачи с помощью модуля itertools воспользуемся функцией permutations. Она генерирует все возможные перестановки без повторений из заданного алфавита – лучший вариант для решения задачи, так как по условия каждая буква может встречаться ровно один раз, следовательно нет необходмости делать дополнительную проверку.

Условия «Буква О только на первом или последнем месте» и «две гласные буквы не могут стоять рядом» записываются в программе аналогично решению с помощью циклов.

from itertools import permutations # Импорт функции для генерации перестановок

s = "ЛОПУХ" # Исходный набор букв
n = 0 # Счётчик допустимых слов

# Перебираем все возможные перестановки из 5 букв
for x in permutations(s):
    w = "".join(x) # Преобразуем перестановку в строку

    # Проверяем условия:
    # 1. Нет "ОУ" или "УО" (гласные не стоят рядом)
    # 2. Буква "О" не в середине (только на 1-й или 5-й позиции)
    if not("ОУ" in w) and not("УО" in w) and not("О" in w[1:4]):
        n += 1 # Увеличиваем счётчик, если условия выполнены

print(n) # Выводим количество допустимых слов

Ответ: 36

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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