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

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

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

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

Задача 1#85069

Иван составляет 9-разрядные двадцатипятиричные числа, в которых цифры, которые кратны трем и кратны восьми, чередуются. Сколько различных чисел может составить Иван?

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

Для составления чисел можно использовать цифры от 0 до 9 и числа от 10 до 24 включительно. Из них кратны трем: 0, 3, 6, 9, 12, 15, 18, 21, 24. Кратны восьми: 0, 8, 16, 24. Кратны и трем, и восьми: 0, 24

Количество 9-разрядных чисел, которые начинаются с цифры, кратной трем:

8⋅4⋅9 ⋅4⋅9⋅4 ⋅9⋅4⋅9 = 13436928

Количество 9-разрядных чисел, которые начинаются с цифры, кратной восьми:

3 ⋅9 ⋅4⋅9 ⋅4 ⋅9⋅4 ⋅9 ⋅4 = 5038848

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

1⋅2 ⋅2⋅2⋅2 ⋅2⋅2⋅2 ⋅2 = 28 = 256

Получаем общее число слов:

13436928 + 5038848 − 256 = 18475520

Идея решения через циклы:

Мы формируем все 9-разрядные числа в двадцатипятиричной системе, в которых цифры, кратные трём и кратные восьми, чередуются. Для этого задаём два множества символов: alf_3 для цифр, кратных трём, и alf_8 для цифр, кратных восьми. Используем 9 вложенных циклов for, чтобы перебрать все варианты цифр на соответствующих позициях. Так как чередование может начинаться с цифры, кратной трём, или с цифры, кратной восьми, мы дважды меняем местами алфавиты, чтобы сгенерировать все варианты. Каждое сформированное число, которое не начинается с нуля, добавляем в множество ans для исключения повторов.

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

# Множество для хранения уникальных чисел
ans = set()

# Символы, кратные 3
alf_3 = "0369CFILO"

# Символы, кратные 8
alf_8 = "08GO"

# Два варианта чередования: начиная с кратного 3 или кратного 8
for i in range(2):
    # Перебор 1-й цифры (кратной 3 или 8)
    for x1 in alf_3:
        # Перебор 2-й цифры (кратной 8 или 3)
        for x2 in alf_8:
            for x3 in alf_3:
                for x4 in alf_8:
                    for x5 in alf_3:
                        for x6 in alf_8:
                            for x7 in alf_3:
                                for x8 in alf_8:
                                    for x9 in alf_3:
                                        # Собираем 9-разрядное число
                                        w = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9
                                        # Проверяем, что число не начинается с нуля
                                        if x1 != "0":
                                            ans.add(w)
    # Меняем местами алфавиты для второго варианта чередования
    alf_3, alf_8 = alf_8, alf_3

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

Идея решения через itertools:

Для решения с помощью модуля itertools используем функцию product, которая генерирует все комбинации заданной длины с повторениями из выбранного множества символов. Сначала генерируем все комбинации, где первая цифра кратна трём (всего 5 цифр) и оставшиеся цифры кратны восьми (4 цифры), чередуя их при сборке числа. Затем повторяем процедуру, начиная с цифры, кратной восьми. Каждое число, которое не начинается с нуля, добавляем в множество ans для исключения повторов.

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

from itertools import product # Импортируем функцию product

# Символы, кратные 3
alf_3 = "0369CFILO"

# Символы, кратные 8
alf_8 = "08GO"

# Множество для хранения уникальных чисел
ans = set()

# Перебор комбинаций с первой цифрой кратной 3
for a in product(alf_3, repeat=5):
    for b in product(alf_8, repeat=4):
        # Формируем число, чередуя цифры
        s = a[0] + b[0] + a[1] + b[1] + a[2] + b[2] + a[3] + b[3] + a[4]
        # Проверяем, что число не начинается с нуля
        if s[0] != "0":
            ans.add(s)

# Перебор комбинаций с первой цифрой кратной 8
for a in product(alf_8, repeat=5):
    for b in product(alf_3, repeat=4):
        # Формируем число, чередуя цифры
        s = a[0] + b[0] + a[1] + b[1] + a[2] + b[2] + a[3] + b[3] + a[4]
        # Проверяем, что число не начинается с нуля
        if s[0] != "0":
            ans.add(s)

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

Ответ: 18475520

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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