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

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

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

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

Задача 1#85466

Суперкомпьютер для разминки генерирует тройки слов. Первое слово имеет длину 5 и состоит из букв слова ПИРОГ, в нём каждая буква может встречаться любое количество раз, при этом буква Р может стоять только после буквы О. Второе слово имеет длину 4 и состоит из цифр шестеричной системы счисления. Третье слово имеет также длину 4 и состоит из цифр пятеричной системы счисления. Причём количество чётных цифр во втором и третьем словах должно быть одинаковым и они не могут начинаться с 0.

Необходимо найти общее число троек, которое может составить Суперкомпьютер.

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

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

Мы разбиваем задачу на три части: первое слово из букв "ПИРОГ второе слово из цифр шестиричной системы и третье слово из цифр пятеричной системы.

1. Для первого слова длиной 5 букв из "ПИРОГ"проверяем условие: буква "Р"может стоять только после буквы "О". Мы формируем все комбинации с повторениями и считаем количество подходящих слов, удовлетворяющих этому условию.

2. Для второго и третьего слов проверяем два условия одновременно:

     - числа не могут начинаться с 0,

     - количество чётных цифр во втором и третьем словах должно совпадать.

После подсчёта допустимых слов для каждой части мы перемножаем результаты, чтобы получить общее число троек.

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

a = "ПИРОГ" # Символы первого слова
b = "012345" # Символы второго слова (шестеричная система)
c = "01234" # Символы третьего слова (пятеричная система)
count1 = 0 # Счётчик для первого слова
count23 = 0 # Счётчик для второй и третьей частей

# Генерация всех 5-буквенных слов первого слова
for x1 in a: # 1-я буква
    for x2 in a: # 2-я буква
        for x3 in a: # 3-я буква
            for x4 in a: # 4-я буква
                for x5 in a: # 5-я буква
                    s = x1 + x2 + x3 + x4 + x5 # Собираем слово
                    # Проверяем условие для буквы "Р": она идёт только после "О"
                    if s.count("Р") == s.count("ОР"):
                        count1 += 1 # Увеличиваем счётчик подходящих слов

# Генерация всех 4-значных чисел второго слова
for x1 in "12345": # первая цифра не равна "0"
    for x2 in b:
        for x3 in b:
            for x4 in b:
                s1 = x1 + x2 + x3 + x4 # Собираем число второго слова
                # Генерация всех 4-значных чисел третьего слова
                for x5 in "1234": # первая цифра не равна "0"
                    for x6 in c:
                        for x7 in c:
                            for x8 in c:
                                s2 = x5 + x6 + x7 + x8 # Собираем число третьего слова
                                # Считаем количество чётных цифр во втором числе
                                m1 = [i for i in s1 if int(i) % 2 == 0]
                                # Считаем количество чётных цифр в третьем числе
                                m2 = [i for i in s2 if int(i) % 2 == 0]
                                # Проверяем условие равенства количества чётных цифр
                                if len(m1) == len(m2):
                                    count23 += 1 # Увеличиваем счётчик
print(count1 * count23) # Перемножаем результаты для общего числа троек

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

Для более компактного решения используем функцию product из модуля itertools.

1. Генерируем все 5-буквенные слова первого слова с повторениями, проверяем условие для "Р".

2. Генерируем все 4-значные комбинации второго слова и 4-значные комбинации третьего слова с учётом, что первая цифра не равна "0".

3. Для проверки количества чётных цифр используем замену всех чётных цифр на "0"и сравниваем их количество в двух словах.

После подсчёта допустимых слов для каждой части перемножаем результаты.

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

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

s1 = "ПИРОГ" # Символы первого слова
cnt1 = 0 # Счётчик для первого слова

# Генерация всех 5-буквенных слов первого слова
for i in product(s1, repeat=5):
    word = "".join(i) # Преобразуем кортеж в строку
    if word.count("Р") == word.count("ОР"): # Проверка условия для "Р"
        cnt1 += 1

s2 = "012345" # Символы второго слова (шестеричная система)
s3 = "01234" # Символы третьего слова (пятеричная система)
cnt23 = 0 # Счётчик для второго и третьего слов

# Генерация всех 4-значных чисел второго слова
for i in product(s2, repeat=4):
    i = "".join(i)
    if i[0] != "0": # Первая цифра не равна 0
        # Генерация всех 4-значных чисел третьего слова
        for j in product(s3, repeat=4):
            j = "".join(j)
            if j[0] != "0": # Первая цифра не равна 0
                # Замена всех чётных цифр на "0" для удобства подсчёта
                i_even = i.replace("2", "0").replace("4", "0")
                j_even = j.replace("2", "0").replace("4", "0")
                # Проверка равенства количества чётных цифр
                if i_even.count("0") == j_even.count("0"):
                    cnt23 += 1
print(cnt1 * cnt23) # Перемножаем результаты для общего числа троек

Ответ: 184257288

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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