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

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

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

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

Задача 1#59230

Паша составляет 6-буквенные слова из букв слова МАШИНА так, что буквы на позициях одинаковой чётности расположены в алфавитном порядке. Сколько различных слов может составить Паша, если каждую букву можно использовать неограниченное количество раз?

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

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

В задаче нужно на 6 позиций букв расставить их так, чтобы на местах одинаковой чётности буквы стояли в алфавитном порядке.

В таком случае, места в слове можно разбить на 2:

1) 3 места с нечётными номерами (1, 3, 5)

2) 3 места с чётными номерами (2, 4, 6)

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

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

Составим следующую таблицу, буквы из верхней строки стоят на первом месте, буквы из левого столбца – на втором месте:

А И М Н Ш
А 5 - - - -
И 4 4 - - -
М 3 3 3 - -
Н 2 2 2 2 -
Ш 1 1 1 1 1

После сложения всех чисел из таблицы, получим 35  способов расставить буквы в алфавитном порядке.

Тогда общее количество слов получим произведением 35⋅35  , так как нужно расставить буквы в алфавитном порядке два раза, в итоге получим 1225  способов, что и будет ответом.

Решение через циклы
Составим программу для перебора всех возможных 6-буквенных слов. Поскольку буквы на позициях одинаковой чётности должны быть в алфавитном порядке, организуем 6 вложенных циклов: первые, третьи и пятые буквы – для нечётных позиций, вторые, четвёртые и шестые – для чётных. Проверка на алфавитный порядок выполняется через сравнение s[0] <= s[2] <= s[4] и s[1] <= s[3] <= s[5]. Python сравнивает строки по порядковым номерам символов в таблице ASCII, что соответствует алфавитному порядку. Если условие выполнено, добавляем слово в множество для исключения повторений.

a = "МАШИНА"  # допустимые буквы
count = set()  # множество для подходящих слов

# перебираем все 6-буквенные комбинации с повторениями
for x1 in a:  # 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 (s[0] <= s[2] <= s[4]) and (s[1] <= s[3] <= s[5]):
                            count.add(s)  # добавляем подходящее слово в множество
print(len(count))  # выводим количество слов

Решение через itertools
Для перебора всех возможных слов удобно использовать функцию product из модуля itertools, которая строит все 6-буквенные комбинации с повторениями. После формирования строки буквы на нечётных позициях (1, 3, 5) записываем в s1, а на чётных (2, 4, 6) – в s2. Далее проверяем, что буквы в s1 и s2 совпадают с тем порядком, который получился бы при их сортировке, то есть стоят в алфавитном порядке. Если условие выполнено, добавляем слово в список, а в конце выводим количество уникальных слов.

from itertools import product

ans = []  # список подходящих слов

for i in product("МАШИНА", repeat=6):  # перебор всех 6-буквенных слов с повторениями
    s = "".join(i)  # формируем строку
    s1 = s[0::2]  # буквы на нечётных позициях (1,3,5)
    s2 = s[1::2]  # буквы на чётных позициях (2,4,6)

    # проверяем условие: буквы на нечётных и чётных позициях в алфавитном порядке
    if s1 == "".join(sorted(s1)) and s2 == "".join(sorted(s2)):
        ans.append(s)
print(len(set(ans)))  # количество уникальных слов

Ответ: 1225

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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