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

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

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

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

Задача 1#137602

Сколько существует восьмеричных пятизначных чисел, не содержащих в своей записи цифру 1, в которых все цифры различны и никакие две чётные или две нечётные цифры не стоят рядом? Любую цифру можно использовать любое количество раз.

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

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

В 8-й системе счисления всего 8 цифр: 7, 6, 5, 4, 3, 2, 1 и 0. По условию в числе не должно присутствовать цифры 1, поэтому алфавит сокращаетcя до 7, 6, 5, 4, 3, 2, 0. Всего получилось четыре чётных цифры и три нечётные.

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

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

3⋅4 ⋅2⋅3⋅1 + 3⋅3⋅3 ⋅2⋅2 = 72 + 108 = 180

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

Сначала создаём пустое множество ans, куда будем добавлять все допустимые числа, чтобы исключить повторения. Обозначим строку a = "0234567" как набор доступных цифр, исключая 1, которые могут стоять на любой позиции. Для каждой позиции числа создаём вложенные циклы, перебирая все возможные варианты:

  • x1 — первая цифра, должна быть не нулём, поэтому цикл идёт по строке "234567".
  • x2, x3, x4, x5 — остальные цифры, перебираются по строке a, содержащей все разрешённые цифры.

Для каждой комбинации формируем строку s = x1 + x2 + x3 + x4 + x5. Далее проверяем два условия:

1. В числе нет подряд стоящих чётных или нечётных цифр. Для этого используем генератор all(int(s[i]) % 2 != int(s[i + 1]) % 2 for i in range(len(s) - 1)), который проверяет для каждой пары соседних цифр, что остатки от деления на 2 различны.

2. Все цифры числа различны, что проверяется условием len(s) == len(set(s)), где set(s) создаёт множество уникальных символов строки.

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

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

# Строка с доступными цифрами
a = "0234567"

# Перебор первой цифры числа (не 0)
for x1 in "234567":
    # Перебор второй цифры числа
    for x2 in a:
        # Перебор третьей цифры числа
        for x3 in a:
            # Перебор четвёртой цифры числа
            for x4 in a:
                # Перебор пятой цифры числа
                for x5 in a:
                    # Формируем строку числа
                    s = x1 + x2 + x3 + x4 + x5
                    # Проверяем условия:
                    # 1. Нет подряд идущих чётных или нечётных цифр
                    # 2. Все цифры различны
                    if all(int(s[i]) % 2 != int(s[i + 1]) % 2 for i in range(len(s) - 1)) and len(s) == len(set(s)):
                        # Если условия выполнены, добавляем число в множество
                        ans.add(s)

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

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

Используем модуль itertools и функцию product, которая генерирует все возможные комбинации цифр длины 5 с повторениями. Перебираем все комбинации из строки a = "0234567" и формируем число из кортежа с помощью .join(i). Для каждой комбинации проверяем:

1. Первая цифра не ноль (s[0] != ’0’). 2. Нет соседних чётных или нечётных цифр, проверка такая же, как в циклах. 3. Все цифры различны.

Если условия выполнены, добавляем число в множество ans. После перебора выводим длину множества.

from itertools import product

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

# Строка с доступными цифрами
a = ’0234567’

# Генерация всех комбинаций длины 5 с повторениями
for i in product(a, repeat=5):
    # Преобразуем кортеж в строку
    s = ’’.join(i)
    # Проверяем условия:
    # 1. Первая цифра не 0
    # 2. Нет подряд идущих чётных или нечётных цифр
    # 3. Все цифры различны
    if (s[0] != ’0’) and all(int(s[i]) % 2 != int(s[i + 1]) % 2 for i in range(len(s) - 1)) and len(s) == len(set(s)):
        # Если условия выполнены, добавляем число в множество
        ans.add(s)

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

Ответ: 180

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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