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

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

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

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

Задача 1#84148

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

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

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

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

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

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

2⋅1 ⋅3⋅1⋅3 + 1⋅3⋅1 ⋅3⋅1 = 18 + 9 = 27

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

Для решения задачи через циклы будем перебирать все пятеричные пятизначные числа, исключая цифру 3, и проверять, что никакие две чётные или две нечётные цифры не стоят рядом. Алгоритм реализуется следующим образом:

Сначала создаём строку a = ’0124’ — это набор доступных цифр (исключаем 3, как указано в условии). Создаём пустое множество count = set() для хранения уникальных чисел, удовлетворяющих условиям.

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

1. for x1 in ’124’ — первая цифра числа, не может быть 0.

2. for x2 in a, for x3 in a, for x4 in a, for x5 in a — перебираем все остальные цифры числа, включая 0.

Внутри циклов формируем строку s = x1+x2+x3+x4+x5, представляющую текущее число.

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

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

# Создаём строку с возможными цифрами (исключая 3)
a = "0124"

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

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

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

Для упрощения перебора всех комбинаций используем модуль itertools и функцию product для генерации всех пятеричных пятизначных комбинаций цифр ’0’-’4’.

1. Преобразуем кортеж i в строку s с помощью ’’.join(i).

2. Проверяем, что в числе нет цифры 3 и первая цифра не равна 0: if not (’3’ in s) and s[0] != ’0’.

3. Для упрощения проверки чередования чётных и нечётных цифр заменяем все чётные цифры на ’2’: s = s.replace(’0’,’2’).replace(’4’,’2’).

4. Проверяем, что одинаковые цифры не стоят подряд: if not(’22’ in s) and not(’11’ in s). Если условие выполнено, увеличиваем счётчик cnt.

В конце выводим cnt — количество допустимых чисел.

from itertools import product

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

# Перебор всех 5-значных комбинаций цифр "0"-"4"
for i in product("01234", repeat=5):
    # Преобразуем кортеж в строку числа
    s = "".join(i)
    # Проверяем отсутствие цифры 3 и что число не начинается с 0
    if not ("3" in s) and s[0] != "0":
        # Заменяем все чётные цифры на "2"
        s = s.replace("0", "2").replace("4", "2")
        # Проверяем, что одинаковые цифры не стоят подряд
        if not ("22" in s) and not ("11" in s):
            # Если условие выполнено, увеличиваем счётчик
            cnt += 1

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

Ответ: 27

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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