Задание 8: комбинаторика — сколько слов и чисел удовлетворяют условию
Считаем количество слов/чисел по заданным правилам — формулой, когда видно умножение, и перебором, когда правила запутаны.
Правило умножения: если первый выбор можно сделать a способами, второй — b способами (независимо), то вместе — a·b способов.
Что проверяет задание 8
Задание 8 — базовый уровень, 1 балл. Дан алфавит из нескольких букв (или цифр), длина слова и набор ограничений: какие буквы где можно ставить, какие пары запрещены, сколько раз буква встречается. Нужно посчитать, сколько различных слов (чисел) удовлетворяют условиям.
На КЕГЭ это задание идеально для перебора кодом: алфавит маленький, длина небольшая, общее число вариантов — тысячи или десятки тысяч, перебор отрабатывает мгновенно. Формулы тоже работают, но в них легко ошибиться на хитром условии, а перебор «тупой и надёжный».
Теория: два инструмента
Формула умножения
Если на каждую позицию буква выбирается независимо от других, число слов — это произведение количеств вариантов по позициям. Пример: 5-буквенные слова из алфавита в 4 буквы, где первая — гласная (2 варианта), остальные — любые (4 варианта): 2·4·4·4·4 = 512.
Перебор
Когда условия связывают соседние буквы («никакие две гласные не стоят рядом», «после Т обязательно идёт А»), удобнее перебрать все слова и для каждого проверить условие. В Python это itertools.product (с повторениями букв) или itertools.permutations (если каждая буква используется один раз).
| Инструмент | Когда |
product(A, repeat=n) | буквы можно повторять, слово длины n |
permutations(A, n) | каждая буква не более одного раза |
Метод решения перебором
- Запишите алфавит и длину слова.
- Сгенерируйте все слова:
product(alphabet, repeat=length). - Для каждого слова проверьте ВСЕ условия задачи; если все выполнены — увеличьте счётчик.
- Выведите счётчик.
Главное — аккуратно перевести словесные ограничения в проверки if. Каждое «нельзя» — это continue, пропускающий слово.
Разбор примера
Алфавит — буквы слова «КОМАР»: К, О, М, А, Р. Гласные — О и А. Сколько 5-буквенных слов можно составить (буквы можно повторять), если слово начинается с гласной и никакие две гласные не стоят рядом?
Условие 1: первая буква ∈ {О, А}. Условие 2: для каждой пары соседних букв нельзя, чтобы обе были гласными. Считать формулой громоздко (гласные «расставлены» нерегулярно), поэтому перебираем.
Решение на Python
from itertools import product
letters = "КОМАР"
vowels = "ОА"
count = 0
for w in product(letters, repeat=5):
s = ''.join(w)
# условие 1: начинается с гласной
if s[0] not in vowels:
continue
# условие 2: никакие две гласные не стоят рядом
bad = any(s[i] in vowels and s[i+1] in vowels for i in range(len(s)-1))
if bad:
continue
count += 1
print("Количество слов:", count)
Вывод:
Количество слов: 558
Перебрано 5⁵ = 3125 слов, условиям удовлетворяют 558. Ноль шансов ошибиться в комбинаторной формуле — машина проверила всё.
Вариант с неповторяющимися буквами
Если в задаче «каждая буква используется не более одного раза», меняем product на permutations. Пример: слова длины 4 из букв А, Е, К, Н, Т (А, Е — гласные), буквы не повторяются, никакие две гласные не рядом.
from itertools import permutations
letters = "АЕКНТ"
vowels = "АЕ"
count = 0
for w in permutations(letters, 4): # выбираем 4 разные буквы из 5
s = ''.join(w)
if any(s[i] in vowels and s[i+1] in vowels for i in range(3)):
continue
count += 1
print("Слов длины 4:", count)
Вывод:
Слов длины 4: 84
Типичные ошибки
- Путают повторение букв. «Буквы можно повторять» →
product; «каждая буква один раз» →permutations. Это меняет ответ в разы. - Считают порядок не там, где надо. В словах порядок важен (АБ ≠ БА); если в задаче «набор» или «множество», порядок не важен — это уже сочетания.
- Теряют граничную пару. Соседние пары — это индексы от 0 до n−2; цикл
range(len(s)-1). - Забывают одно из условий. Каждое ограничение — отдельная проверка; пропустил одну — ответ завышен.
Итог
- Алфавит маленький — перебор
itertoolsрешает задание 8 надёжнее формул. product(repeat=n)— с повторениями,permutations(A, n)— без повторений.- Каждое словесное ограничение переводите в отдельную проверку
if … continue.