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

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

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

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

Задача 1#63005

Сколько существует чисел, делящихся на 5, десятичная запись которых содержит 8 цифр, причём все цифры различны и никакие две чётные и две нечётные цифры не стоят рядом.

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

Решение аналитически:

Если число делится на 5, то оно оканчивается либо на 5, либо на 0.

Если число оканчивается на 5, то число имеет вид: ЧНЧНЧНЧ5, где Ч – четное число, Н – нечетное число. Кроме 5 существует 4 нечетных числа. Четных чисел в таком случае 5. Но! Важно учесть, что число не может начинаться с 0, поэтому для первого цифры числа будет не 5 вариантов. а 4.

Получаем, количество вариантов: 4 ∗4∗ 4∗ 3∗3 ∗2∗ 2 = 2304  .

Если число оканчивается на 0, то число имеет вид: НЧНЧНЧН0, где Ч – четное число, Н – нечетное число. Кроме 0 существует 4 четных числа. Нечетных чисел в таком случае 5.

Получаем, количество вариантов: 5 ∗4∗ 4∗ 3∗3 ∗2∗ 2 = 2880  .

Итоговое число слов: 2304+ 2880 = 5184  .

Решение программой с помощью циклов:

Напишем программу для перебора всевозможных комбинаций из заданных цифр. Для этого организуем 8  вложенных циклов (по одному на каждую позицию в слове). Каждый цикл перебирает цифры заданной строки, формируя все возможные комбинации. Запишем количество подходящих слов.

#создаем строки с вариантами цифр числа
a = "0123456789"
a1 = "123456789"
d5 = "05"
ch = "02468"
nch = "13579"
# Создаем контейнер
pairs = set()
# Ввод счетчика
c = 0
for m in ch:
    for n in ch:
        pairs.add(m + n) # Все комбинации чётных чисел
for m in nch:
    for n in nch:
        pairs.add(m + n) # Все комбинации нечётных чисел
# Подчёт количества чисел
for i in a1:
    for j in a:
        for n in a:
            for k in a:
                for m in a:
                    for l in a:
                        for h in a:
                            for v in d5:
                                s = i + j + n + k + m + l + h + v # Формируем число
                                if all(s.count(i) <= 1 for i in s) and all(s.count(t) == 0 for t in pairs):
                                    c += 1
print(c)

# Различность цифр проверяет первое условие
# Наличие двух рядом стоящих чётных/нечётных цифр проверяет второе условие, тут мы сначала создаём массив для таких пар, составляем их с помощью вложенных циклов, а потом проверяем условием уже при составлении числа
# Проверки делимости на 5 тут нет, т.к. в качестве последней цифры либо 5, либо 0


Решение программой с помощью модуля itertools:

Для решения задачи с помощью модуля itertools воспользуемся функцией permutations. Она генерирует все возможные слова из заданного алфавита. Запишем количество подходящих слов.

from itertools import permutations

ans = set() # Множество подходящих слов
alf = "0123456789" # Цифры к задаче
# Получим все комбинации из 8 цифр из заданного алфавита
for w in permutations(alf, 8):
    w = "".join(w) # join объединит цифры
    if w[0] != "0" and w[-1] in "05": # Проверяем по условию
        f = 1 # Флаг для проверки условия с комбинациями
        for i in range(len(w) - 1):
            if int(w[i]) % 2 == int(w[i + 1]) % 2: # Если в слове есть гласная + гласная или согласная + согласная
                f = 0
                break
        if f: # Если условие с комбинациями соблюдено
            ans.add(w) # Добавим слово в множество
print(len(ans)) # Выведем нужное количество

Ответ: 5184

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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