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

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

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

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

Задача 1#85464

Арез составляет шестибуквенные слова из букв слова НАКОВАЛЬНЯ. Каждая буква может встречаться в слове только один раз, на первом месте не может стоять буква Ь, а буква Л может стоять только в окружении гласных. Сколько слов может составить Арез?

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

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

Буква Л может стоять только на позициях 2, 3, 4, 5, так как ей нужны соседи-гласные.

1. Л на 2-й позиции: Структура слова: _ Л _ _ _ _.

Гласные: позиции 1 (слева от Л) и 3 (справа от Л). Количество способов выбрать гласные для позиций 1 и 3: 3 ∗2 = 6  .

Остаются позиции 4, 5, 6, которые нужно заполнить из оставшихся 5 букв (исключая уже использованные гласные). Общее количество перестановок для позиций 4, 5, 6: 5∗ 4∗3 = 60  .

2. Л на 3-й позиции: Структура: _ _ Л _ _ _.

Гласные: позиции 2 и 4. Количество способов выбрать гласные: 3∗2 = 6  .

Остаются позиции 1, 5, 6, которые заполняются из 5 букв. Всего перестановок для 1, 5, 6: 5∗ 4∗ 3 = 60  .

Запрещённые случаи (когда Ь на 1-й позиции): фиксируем Ь на 1-й, остальные 2 буквы выбираем из 4: 4 ∗3 = 12  .

Допустимые перестановки: 60 − 12 = 48  . Тогда итоговое количество слов для варианта: 6 ∗48 = 288  слов.

Аналогично этой позиции вычисляются и Л на 4-й позиции _ _ _ Л _ _ и Л на 5-й позиции _ _ _ _ Л _.

Итог для слов с Л: 360 + 288 + 288+ 288 = 1224  слов.

Слова без Л: выбираем 6 букв из Н, А, К, О, В, Ь, Я (7 букв), учитывая, что Ь не может быть на первом месте: 7!− 6∗ 6! = 4320  .

Общее количество допустимых слов: 1224+ 4320 = 5544  .

Идея решения через циклы:

Мы формируем все возможные шестибуквенные слова из букв слова "НАКОВАЛЬНЯ учитывая ограничения:

1. Каждая буква может встречаться только один раз.

2. На первом месте не может стоять буква "Ь".

3. Буква "Л"может встречать только в окружении гласных букв.

Для этого мы используем шесть вложенных циклов for, каждый перебирает буквы исходного слова. После формирования слова проверяем:

- что все буквы встречаются только один раз с помощью all(s.count(i) == 1 for i in s);

- если буква "Л"присутствует, проверяем наличие хотя бы одной комбинации "гласная-Л-гласная иначе слово недопустимо;

- если буквы "Л"нет, слово сразу добавляется в множество count, чтобы не было дубликатов.

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

a = "НАКОВАЛЬНЯ" # Исходное слово

count = set() # Множество для хранения допустимых слов
gl = "АОЯ" # Гласные буквы слова
# Генерируем все комбинации, в которых буква "Л" окружена гласными
m = [x1 + "Л" + x2 for x1 in gl for x2 in gl]

# Перебор всех позиций слова через вложенные циклы
for x1 in "НАКОВАЛНЯ": # 1-я буква
    for x2 in a: # 2-я буква
        for x3 in a: # 3-я буква
            for x4 in a: # 4-я буква
                for x5 in a: # 5-я буква
                    for x6 in a: # 6-я буква
                        s = x1 + x2 + x3 + x4 + x5 + x6 # Собираем слово
                        # Проверка уникальности всех букв
                        if all(s.count(i) == 1 for i in s):
                            if "Л" in s:
                                # Проверка наличия хотя бы одной допустимой комбинации Л
                                if any(i in s for i in m):
                                    count.add(s) # Добавляем слово в множество
                            else:
                                count.add(s) # Добавляем слово без Л
print(len(count)) # Вывод количества допустимых слов

Идея решения через itertools:

Для более компактного решения используем модуль itertools и функцию permutations, которая генерирует все перестановки длины 6 из множества букв. Каждое слово проверяем:

- первая буква не может быть "Ь"или "Л последняя буква не может быть "Л";

- каждая буква "Л"внутри слова должна быть окружена гласными;

- если слово проходит проверки, увеличиваем счётчик cnt.

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

from itertools import permutations # Импортируем функцию permutations

s = set("НАКОВАЛЬНЯ") # Множество букв исходного слова
gl = "АОЯ" # Множество гласных букв

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

# Перебор всех перестановок длины 6
for i in permutations(s, 6):
    i = "".join(i) # Преобразуем кортеж в строку
    # Проверка первой и последней буквы на недопустимые значения
    if i[0] == "Ь" or i[0] == "Л" or i[-1] == "Л":
        continue
    flag = True # Флаг для проверки правил буквы "Л" внутри слова
    # Проверка каждой буквы "Л", кроме крайних позиций
    for j in range(1, len(i) - 1):
        if i[j] == "Л":
            if not (i[j - 1] in gl and i[j + 1] in gl):
                flag = False # Нарушение правил для "Л"
                break
    if flag:
        cnt += 1 # Увеличиваем счётчик допустимых слов
print(cnt) # Вывод количества допустимых слов

Ответ: 5544

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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