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

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

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

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

Задача 1#7293

Друг составляет пятизначные числа, используя цифры от 2  до 8  включительно. Цифры в числе могут использоваться только один раз или не использоваться совсем. Рядом с чётными числами не должно стоять чётных, а рядом с нечётными не должно стоять нечётных. Сколько различных чисел друг может составить?

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

Пусть первая цифра числа чётная, тогда она может быть одной из 4  цифр. Вторая нечётная, она может быть одной из 3  цифр. Третья чётная, она может быть одной из 3  оставшихся чётных чисел. Четвёртая нечётная, она может быть одной из 2  оставшихся нечётных цифр. Пятая чётная, может быть одной из 2  оставшихся чётных. Значит в таком случае друг может составить 4 ⋅ 3 ⋅ 3 ⋅ 2 ⋅ 2 = 144  различных числа. Если первая цифра нечётная, то по той же логике мы можем составить 3 ⋅ 4 ⋅ 2 ⋅ 3 ⋅ 1 = 72  различных чисел. Всего друг может составить 144 + 72 =  216  чисел.
Решение кодом через циклы:

Решение через циклы строится на полном переборе всех возможных пятизначных комбинаций цифр от 2 до 8. Сначала создаём пустое множество ans для хранения уникальных чисел и определяем строку alf = ’2345678’ с доступными цифрами. Для формирования числа используем пять вложенных циклов, где переменные x1, x2, x3, x4, x5 перебирают все цифры из alf и формируют строку w = x1 + x2 + x3 + x4 + x5. После формирования числа проверяем, что все цифры уникальны с помощью len(w) == len(set(w)). Для проверки условия чередования чётных и нечётных цифр создаём временную строку w1, в которой заменяем все чётные цифры (4,6,8) на ’2’, а нечётные (5,7) на ’3’. Если в этой строке нет двух одинаковых символов подряд (’22’ и ’33’), число удовлетворяет условию, и мы добавляем его в множество ans. В конце выводим len(ans), что и есть количество допустимых чисел.

# Создаем множество для хранения уникальных чисел
ans = set()
# Определяем доступные цифры
alf = ’2345678’

# Перебор цифр первой позиции числа
for x1 in alf:
    # Перебор цифр второй позиции числа
    for x2 in alf:
        # Перебор цифр третьей позиции числа
        for x3 in alf:
            # Перебор цифр четвертой позиции числа
            for x4 in alf:
                # Перебор цифр пятой позиции числа
                for x5 in alf:
                    # Формируем число как строку из выбранных цифр
                    w = x1 + x2 + x3 + x4 + x5
                    # Проверяем, что все цифры числа уникальны
                    if len(w) == len(set(w)):
                        # Заменяем чётные на ’2’, нечётные на ’3’ для проверки чередования
                        w1 = w.replace(’4’, ’2’).replace(’6’, ’2’).replace(’8’, ’2’)
                        w1 = w1.replace(’5’, ’3’).replace(’7’, ’3’)
                        # Проверяем, что одинаковые типы цифр не стоят рядом
                        if (’22’ not in w1) and (’33’ not in w1):
                            # Добавляем число в множество уникальных значений
                            ans.add(w)
# Выводим количество допустимых чисел
print(len(ans))

Решение кодом через itertools:

Для более компактного решения используем модуль itertools. Функция permutations позволяет сгенерировать все 5-значные перестановки цифр без повторений. Сначала импортируем функцию, создаём пустое множество ans и определяем строку alf = ’2345678’ с доступными цифрами. Для каждой перестановки формируем строку w, затем создаём строку w1, заменяя чётные цифры на ’2’ и нечётные на ’3’. Если в w1 нет двух одинаковых символов подряд, число удовлетворяет условию чередования и добавляется в множество ans. В конце выводим len(ans), что и является ответом.

from itertools import permutations

# Создаем множество для хранения уникальных чисел
ans = set()
# Цифры, доступные для составления числа
alf = ’2345678’

# Перебираем все 5-значные перестановки без повторений
for x in permutations(alf, 5):
    # Преобразуем перестановку в строку
    w = ’’.join(x)
    # Заменяем чётные на ’2’, нечётные на ’3’ для проверки чередования
    w1 = w.replace(’4’, ’2’).replace(’6’, ’2’).replace(’8’, ’2’)
    w1 = w1.replace(’5’, ’3’).replace(’7’, ’3’)
    # Проверяем, что одинаковые типы цифр не стоят рядом
    if (’22’ not in w1) and (’33’ not in w1):
        # Добавляем число в множество уникальных значений
        ans.add(w)

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

Ответ: 216

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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