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

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

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

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

Задача 1#84845

Дарья составляет 6-буквенные слова перестановкой букв слова ВЕРСИЯ. При этом в слове не могут стоять рядом две согласные буквы, а буква Я не может стоять на втором или четвертом месте. Словом считается любая допустимая последовательность букв, не обязательно осмысленная. Сколько слов может составить Дарья?

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

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

У нас в распоряжении 3 гласные и 3 согласные буквы. Для начала составим варианты расстановки согласных букв так, чтобы они не стояли рядом:

1) С*С*С*

2) С*С**С

3) С**С*С

4) *С*С*С

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

Теперь проанализируем гласные буквы, которые должны стоять на местах звёздочки.

В первом варианте буква Я не может стоять на 2 местах, а значит стоит на последнем. Тогда на двух оставшихся местах будет 2 ⋅1 = 2  варианта расстановки гласных. Тогда общее количество слов в первом варианте равно 6 ⋅2 = 12  .

Во втором варианте буква Я также не может стоять на 2 местах, и стоит на предпоследнем. По аналогии, количество вариантов равно 6⋅2 = 12  .

В третьем варианте буква Я не может стоять только на 2 месте, так что на 2 месте стоит одна из двух гласных, на третьем – одна из двух оставшихся и на пятом – оставшаяся гласная. Тогда общее количество вариантов расстановки гласных равно 2⋅2 ⋅1 = 4  , откуда общее количество вариантов равно 6 ⋅4 = 24  .

И наконец, для 4 варианта буква Я может стоять на любой месте. Тогда расставить можно 3 ⋅2⋅1 = 6  вариантов гласных букв. В итоге для 4 варианта будет 6⋅6 = 36  способов расстановки.

Просуммировав все варианты, получим 12 + 12+ 24+ 36 = 84  , после чего запишем ответ.

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

Для решения задачи через циклы мы будем перебирать все возможные 6-буквенные слова, которые можно составить перестановкой букв слова "ВЕРСИЯ и проверять их на выполнение условий: буквы не повторяются, две согласные не стоят рядом, а буква Я не стоит на 2-й и 4-й позиции.

Сначала создаём строку a = ’ВЕРСИЯ’ — все буквы исходного слова, и a1 = ’ВЕРСИ’ — те же буквы без Я, чтобы использовать её на позициях, где Я недопустима. Далее определяем строку sogl = ’ВРС’, которая содержит все согласные буквы слова. С помощью генератора [x1+x2 for x1 in sogl for x2 in sogl] формируем список всех возможных пар согласных m, которые нельзя допускать подряд в слове. Создаём пустое множество count = set() для хранения уникальных допустимых слов.

Далее используем 6 вложенных циклов for, по одному на каждую позицию слова:

1. for x1 in a — выбираем первую букву (может быть любая).

2. for x2 in a1 — выбираем вторую букву (Я недопустима на 2-й позиции).

3. for x3 in a — третья буква, любая.

4. for x4 in a1 — четвёртая буква (Я недопустима на 4-й позиции).

5. for x5 in a — пятая буква, любая.

6. for x6 in a — шестая буква, любая.

Внутри циклов формируем строку s = x1+x2+x3+x4+x5+x6. Проверяем условия:

- Все буквы различны len(set(s)) == len(s).

- Слово не содержит пар согласных подряд all(i not in s for i in m).

Если оба условия выполнены, добавляем слово в множество count. После завершения перебора выводим len(count) — количество допустимых слов.

# Исходные буквы
a = ’ВЕРСИЯ’
# Буквы без "Я" для позиций 2 и 4
a1 = ’ВЕРСИ’
# Согласные буквы
sogl = ’ВРС’
# Все пары согласных, которые нельзя допускать рядом
m = [x1+x2 for x1 in sogl for x2 in sogl]
# Множество для хранения всех допустимых слов
count = set()

# Перебор первой буквы
for x1 in a:
    # Перебор второй буквы (Я недопустима)
    for x2 in a1:
        # Перебор третьей буквы
        for x3 in a:
            # Перебор четвёртой буквы (Я недопустима)
            for x4 in a1:
                # Перебор пятой буквы
                for x5 in a:
                    # Перебор шестой буквы
                    for x6 in a:
                        # Формируем слово
                        s = x1+x2+x3+x4+x5+x6
                        # Проверяем условия:
                        # 1. Все буквы уникальны
                        # 2. Нет двух согласных подряд
                        if len(set(s)) == len(s) and all(i not in s for i in m):
                            # Добавляем слово в множество
                            count.add(s)
# Выводим количество допустимых слов
print(len(count))

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

Для решения с помощью модуля itertools используем функцию permutations, которая генерирует все возможные перестановки букв слова "ВЕРСИЯ". Каждая перестановка преобразуется в строку и проверяется на условия:

1. Буква Я не на 2-й и 4-й позиции s[1] != ’Я’ and s[3] != ’Я’ (индексы с нуля).

2. Нет двух согласных подряд проверяем, что ни одна пара ’ВР’, ’РВ’, ’ВС’, ’СВ’, ’СР’, ’РС’ не содержится в слове.

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

from itertools import permutations

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

# Перебор всех перестановок букв слова "ВЕРСИЯ"
for x in permutations(’ВЕРСИЯ’):
    # Преобразуем кортеж в строку
    s = ’’.join(x)
    # Проверяем условия:
    # 1. Буква Я не на 2-й и 4-й позиции
    # 2. Нет двух согласных подряд
    if s[1] != ’Я’ and s[3] != ’Я’ and (’ВР’ not in s) and (’РВ’ not in s) and (’ВС’ not in s) and (’СВ’ not in s) and (’СР’ not in s) and (’РС’ not in s):
        # Если условия выполнены, увеличиваем счётчик
        count += 1
# Выводим результат
print(count)

Ответ: 84

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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