Россия, Пошатово |
Порождение комбинаторных объектов
2.7. Подсчет количеств
Иногда можно найти количество объектов с тем или иным свойством, не перечисляя их. Классический пример: - число всех -элементных подмножеств -элементного множества - можно найти, заполняя таблицу по формулам
или по формуле (Первый способ эффективнее, если надо вычислить много значений .)Приведем другие примеры.
2.7.1. (Число разбиений; предлагалась на Всесоюзной олимпиаде по программированию 1988 года) Пусть - число разбиений целого положительного на целые положительные слагаемые (без учета порядка, и - одно и то же разбиение). При положим (единственное разбиение не содержит слагаемых). Построить алгоритм вычисления для заданного .
Решение. Можно доказать (это нетривиально) такую формулу для :
(знаки у пар членов чередуются, вычитаемые в одной паре равны и ; сумма конечна - мы считаем, что при ).Однако и без ее использования можно придумать способ вычисления , который существенно эффективнее перебора и подсчета всех разбиений.
Обозначим через (для , ) число разбиений на целые положительные слагаемые, не превосходящие . (При этом считаем равным для всех .) Очевидно, . Все разбиения на слагаемые, не превосходящие , разобьем на группы в зависимости от максимального слагаемого (обозначим его ). Число равно сумме (по всем от до ) количеств разбиений со слагаемыми не больше и максимальным слагаемым, равным . А разбиения на слагаемые не более с первым слагаемым, равным , по существу представляют собой разбиения на слагаемые, не превосходящие (при ). Так что
что позволяет заполнять таблицу значений функции .2.7.2. (Счастливые билеты; предлагалась на Всесоюзной олимпиаде по программированию 1989 года.) Последовательность из цифр (каждая цифра от до ) называется счастливым билетом, если сумма первых цифр равна сумме последних цифр. Найти число счастливых последовательностей данной длины.
Решение. (Сообщено одним из участников олимпиады; к сожалению, не могу указать фамилию, так как работы проверялись зашифрованными.) Рассмотрим более общую задачу: найти число последовательностей, где разница между суммой первых цифр и суммой последних цифр равна ( ). Пусть - число таких последовательностей.
Разобьем множество таких последовательностей на классы в зависимости от разницы между первой и последней цифрами. Если эта разница равна , то разница между суммами групп из оставшихся цифр равна . Учитывая, что пар цифр с разностью бывает , получаем формулу
(Некоторые слагаемые могут отсутствовать, так как может быть слишком велико.)В некоторых случаях ответ удается получить в виде явной формулы.
2.7.3. Доказать, что число Каталана (количество последовательностей длины из единиц и минус единиц, в любом начальном отрезке которых не меньше единиц, чем минус единиц) равно .
Указание. Число Каталана есть число ломаных, идущих из в шагами и , не опускающихся в нижнюю полуплоскость, т.е. разность числа всех ломаных (которое есть ) и числа ломаных, опускающихся в нижнюю полуплоскость. Последние можно описать также как ломаные, пересекающие прямую . Отразив их кусок справа от самой правой точки пересечения относительно указанной прямой, мы установим взаимно однозначное соответствие между ними и ломаными из в . Остается проверить, что .