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

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

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

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

Задача 1#72439

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

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

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

Так как буква Р должна встречаться 2 или 3 раза (максимум 3, так как длина слова 5, и буквы Р не могут стоять рядом), рассмотрим оба случая.

1. Нам нужно разместить 2 буквы Р в 5 позициях так, чтобы они не стояли рядом. Возможные пары позиций (нумерация с 1): (1,3), (1,4), (1,5), (2,4), (2,5), (3,5) — всего 6 вариантов. Остаётся 3 позиции, каждая из которых может быть заполнена 4 способами: 43 = 64  . Итого: 6 ∗64 = 384  вариантов.

2. Теперь разместим 3 буквы Р в 5 позициях без соседства. Единственный вариант: (1,3,5). Остаётся 2 позиции, каждая из которых может быть заполнена 4 способами: 42 = 16  . Итого: 1 ∗16 = 16  вариантов.

Складываем оба случая: 384 + 16 = 400

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

Для решения задачи через циклы мы будем перебирать все возможные 5-буквенные слова из букв "О "Б "Р "У "Ч"и проверять выполнение условий: буква "Р"встречается хотя бы 2 раза и буквы "Р"не стоят рядом. Алгоритм реализуется следующим образом:

Сначала создаём строку a = ’ОБРУЧ’ с доступными буквами. Создаём пустое множество c = set() для хранения уникальных слов, удовлетворяющих условиям.

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

1. for x1 in a — перебираем первую букву слова.

2. for x2 in a — перебираем вторую букву слова.

3. for x3 in a, for x4 in a, for x5 in a — перебираем третью, четвёртую и пятую буквы.

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

Затем проверяем два условия:

- s.count(’Р’) >= 2 — буква "Р"встречается хотя бы 2 раза.

- ’РР’ not in s — буквы "Р"не стоят рядом.

Если оба условия выполняются, добавляем слово в множество c.

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

# Создаём строку с доступными буквами
a = ’ОБРУЧ’

# Создаём множество для хранения всех уникальных допустимых слов
c = set()

# Перебор всех возможных 5-буквенных комбинаций
for x1 in a:
    # Перебираем вторую букву
    for x2 in a:
        # Перебираем третью букву
        for x3 in a:
            # Перебираем четвёртую букву
            for x4 in a:
                # Перебираем пятую букву
                for x5 in a:
                    # Формируем слово из выбранных букв
                    s = x1+x2+x3+x4+x5
                    # Проверяем условия:
                    # 1. Буква "Р" встречается хотя бы 2 раза
                    # 2. Буквы "Р" не стоят рядом
                    if s.count(’Р’) >= 2 and ’РР’ not in s:
                        # Добавляем слово в множество
                        c.add(s)

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

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

Для упрощения перебора всех комбинаций используем модуль itertools и функцию product, которая создаёт декартово произведение букв, формируя все возможные 5-буквенные слова.

1. Генерируем все комбинации букв ’О’, ’Б’, ’Р’, ’У’, ’Ч’ длиной 5 с помощью product(’ОБРУЧ’, repeat=5).

2. Преобразуем кортеж x в строку s = ’’.join(x).

3. Проверяем, что буква "Р"встречается хотя бы 2 раза (s.count(’Р’) >= 2) и что букв "Р"нет подряд (’РР’ not in s).

4. Если оба условия выполняются, увеличиваем счётчик c на 1.

В конце выводим c — количество слов, удовлетворяющих условиям.

from itertools import product

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

# Перебор всех возможных 5-буквенных комбинаций
for x in product(’ОБРУЧ’, repeat = 5):
    # Преобразуем кортеж букв в строку слова
    s = ’’.join(x)
    # Проверяем условия:
    # 1. Буква "Р" встречается хотя бы 2 раза
    # 2. Буквы "Р" не стоят рядом
    if s.count(’Р’) >= 2 and ’РР’ not in s:
        # Увеличиваем счётчик, если условия выполнены
        c += 1

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

Ответ: 400

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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