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

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

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

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

Задача 1#49358

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

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

Допустим, что цифра "1"стоит на первой и второй позиции. Тогда, оставшиеся три числа мы можем разместить 1 ⋅1⋅3⋅3 ⋅3 = 27  способами.

Найдём число способов, которыми мы можем поставить две цифры "1"на пять мест.     --5!--   -5!-   4⋅5
k = 2!⋅(5−2)! = 3!⋅2! = 2 = 10  .

Общее число вариантов равно 27⋅10 = 270  .

Решение программой (циклы):
Напишем программу для перебора всевозможных 5-символьных комбинаций, состоящих из цифр 1, 2, 3, 4. Для этого организуем 5 вложенных циклов (по одному на каждую цифру). Каждый цикл перебирает цифры заданной строки "1234 формируя все возможные комбинации. После составления очередного шифра необходимо его проверить на соответствие условию, что цифра 1 встречается ровно два раза. Для этого будем использовать метод count. Если комбинация проходит эту проверку, добавляем её в множество. После завершения циклов выводим длину множества и получаем ответ.

ans = set()  # множество для шифров
alf = "1234"  # доступные цифры

# Перебор всех возможных 5-символьных комбинаций
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

                    # проверяем, что "1" встречается ровно два раза
                    if w.count("1") == 2:
                        # добавляем подходящую комбинацию в ответ
                        ans.add(w)
print(len(ans))  # вывод результата

Решение программой (itertools):
Для решения задачи с помощью модуля itertools воспользуемся функцией product. Она генерирует все комбинации заданной длины с повторениями из заданного алфавита. Функция product сохраняет алфавитный порядок, так как перебирает символы в том же порядке, в котором они указаны алфавите. Условие «цифра 1 встречается ровно два раза» записывается в программе аналогично решению с помощью циклов.

from itertools import product

ans = set()
alf = "1234"

# Генерируем все возможные 5-буквенные комбинации из цифр
for w in product(alf, repeat=5):
    w = "".join(w)  # Преобразуем кортеж символов в строку

    # проверяем, что "1" встречается ровно два раза
    if w.count("1") == 2:
        ans.add(w)  # добавляем подходящий шифр в ответ

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

Ответ: 270

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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