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

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

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

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

Задача 1#64056

Определите количество восьмизначных чисел, записанных в пятиричной системе счисления, которые не оканчиваются на цифры, меньшие или равные 2, а также содержат поровну четных и нечетных цифр.

В ответе укажите одно число - количество найденных чисел.

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

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

Случай 1: Последняя цифра 3 (нечётная)

Если первая цифра чётная (2 или 4): 2 варианта. Остаётся 3 чётных на 6 позиций: --6!--= 20
3!(6−3)!  . На каждую позицию для нечетных можно выбрать одну из двух букв, на каждую позицию для четных - одну из трех. Итого вариантов: 2 ∗20∗ 33 ∗23 = 8640  .

Если первая цифра нечётная (1 или 3): 2 варианта. Остаётся 4 чётных на 6 позиций: ---6!-- = 15
4!(6−4)!  . На каждую позицию для нечетных можно выбрать одну из двух букв, на каждую позицию для четных - одну из трех. Вариантов: 2 ∗15∗ 34 ∗22 = 9720  .

Всего для случая 1: 8640+ 9720 = 18360  .

Случай 2: Последняя цифра 4 (чётная)

Если первая цифра чётная (2 или 4): 2 варианта. Остаётся 2 чётных на 6 позиций: C(6,2)2!(66−!2)! = 15  . На каждую позицию для нечетных можно выбрать одну из двух букв, на каждую позицию для четных - одну из трех. Вариантов: 2 ∗15∗ 32 ∗24 = 4320  .

Если первая цифра нечётная (1 или 3): 2 варианта. Остаётся 3 чётных на 6 позиций:    6!
3!(6−3)! = 20  .На каждую позицию для нечетных можно выбрать одну из двух букв, на каждую позицию для четных - одну из трех. Вариантов: 2 ∗20∗ 33 ∗23 = 8640  .

Всего для случая 2: 4320+ 8640 = 12960  .

Итоговое количество: 18360 + 12960 = 31320  .

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

Для решения задачи через циклы мы будем поэтапно формировать все восьмизначные числа в пятиричной системе (цифры от 0 до 4) и проверять их на выполнение двух условий: первая цифра не равна нулю, последняя цифра больше 2, и количество чётных и нечётных цифр одинаково. Алгоритм реализуется следующим образом:

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

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

1. for x1 in ’1234’ — выбираем первую цифру числа. Она не может быть нулём, поэтому перебираем только ’1’, ’2’, ’3’, ’4’.

2. for x2 in a, for x3 in a, ..., for x7 in a — для остальных цифр (со 2-й по 7-ю) выбираем любую цифру из ’0’, ’1’, ’2’, ’3’, ’4’.

3. for x8 in ’34’ — последняя цифра должна быть больше 2, поэтому перебираем только ’3’ и ’4’.

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

Затем проверяем условие равного количества чётных и нечётных цифр. Для этого создаём список всех чётных цифр числа с помощью list comprehension: [i for i in s if int(i) % 2 == 0]. Аналогично для нечётных: [i for i in s if int(i) % 2 != 0]. Если их длины равны, добавляем число в множество count.

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

# Создаём строку с возможными цифрами пятиричной системы
a = ’01234’

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

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

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

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

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

2. Проверяем условие, что первая цифра не ноль: s[0] != ’0’.

3. Проверяем, что последняя цифра > 2: int(s[7]) > 2.

4. Подсчитываем количество чётных цифр в числе с помощью цикла for a in s: if int(a) % 2 == 0: count += 1 . 5. Если количество чётных цифр равно 4 (значит, и нечётных тоже 4), увеличиваем общий счётчик k.

В конце выводим k — количество чисел, удовлетворяющих условиям задачи.

import itertools

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

# Перебор всех 8-значных комбинаций цифр ’0’-’4’
for x in itertools.product(’01234’, repeat = 8):
    # Преобразуем кортеж в строку числа
    s = ’’.join(x)
    # Проверяем первую цифру (не 0) и последнюю (>2)
    if s[0] != ’0’ and int(s[7]) > 2:
        # Считаем количество чётных цифр
        count = 0
        for a in s:
            if int(a) % 2 == 0:
                count += 1
        # Если чётных цифр 4, число подходит
        if count == 4:
            k += 1

# Выводим результат
print(k)

Ответ: 31320

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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