2.7. Подсчет количеств

  •  
      Иногда можно найти количество объектов с тем или иным свойством, не перечисляя их. Классический пример: C(n,k) - число всех k-элементных подмножеств n-элементного множества - можно найти, заполняя таблицу значений функции С по формулам:
      C (n,0) = C (n,n) = 1 (n >= 1)
      C (n,k) = C (n-1,k-1) + C (n-1,k) (n > 1, 0 < k < n);

      или по формуле n!/((k!)*(n-k)!). (Первый способ эффективнее, если надо вычислить много значений С(n,k).)

      Приведём другие примеры.

      2.7.1 (Число разбиений) (Предлагалась на Всесоюзной олимпиаде по программированию 1988 года.) Пусть P(n) - число разбиений целого положительного n на целые положительные слагаемые (без учета порядка, 1+2 и 2+1 - одно и то же разбиение). При n=0 положим P(n) = 1 (единственное разбиение не содержит слагаемых). Построить алгоритм вычисления P(n) для заданного n.

      Решение. Можно доказать (это нетривиально) такую формулу для P(n):
      P(n) = P(n-1)+P(n-2)-P(n-5)-P(n-7)+P(n-12)+P(n-15) +...

      (знаки у пар членов чередуются, вычитаемые в одной паре равны (3*q*q-q)/2 и (3*q*q+q)/2).

      Однако и без ее использования можно придумать способ вычисления P(n), который существенно эффективнее перебора и подсчета всех разбиений.

      Обозначим через R(n,k) (при n >= 0, k >= 0) число разбиений n на целые положительные слагаемые, не превосходящие k. (При этом R(0,k) считаем равным 1 для всех k >= 0.) Очевидно, P(n) = R(n,n). Все разбиения n на слагаемые, не превосходящие k, разобьем на группы в зависимости от максимального слагаемого (обозначим его i). Число R(n,k) равно сумме (по всем i от 1 до k) количеств разбиений со слагаемыми не больше k и максимальным слагаемым, равным i. А разбиения n на слагаемые не более k с первым слагаемым, равным i, по существу представляют собой разбиения n - i на слагаемые, не превосходящие i (при i <= k). Так что
      R(n,k) = сумма по i от 1 до k чисел R(n-i,i) при k <= n;
      R(n,k) = R(n,n) при k >= n,

      что позволяет заполнять таблицу значений функции R.

      2.7.2. (Счастливые билеты) (Предлагалась на Всесоюзной олимпиаде по программированию 1989 года). Последовательность из 2n цифр (каждая цифра от 0 до 9) называется счастливым билетом, если сумма первых n цифр равна сумме последних n цифр. Найти число счастливых последовательностей данной длины.

      Решение. (Сообщено одним из участников олимпиады; к сожалению, не могу указать фамилию, так как работы проверялись зашифрованными.) Рассмотрим более общую задачу: найти число последовательностей, где разница между суммой первых n цифр и суммой последних n цифр равна k (k = -9n,..., 9n). Пусть T(n, k) - число таких последовательностей.

      Разобьем множество таких последовательностей на классы в зависимости от разницы между первой и последней цифрами. Если эта разница равна t, то разница между суммами групп из оставшихся n-1 цифр равна k-t. Учитывая, что пар цифр с разностью t бывает 10 - (модуль t), получаем формулу
      T(n,k) = сумма по t от -9 до 9 чисел (10-|t|) * T(n-1, k-t).
      (Некоторые слагаемые могут отсутствовать, так как k-t может быть слишком велико.)

      2.7.3. Доказать, что число Каталана (количество последовательностей длины 2n из n единиц и n минус единиц, в любом начальном отрезке которых не меньше единиц, чем минус единиц) в n+1 раз меньше числа n-элементных подмножеств 2n-элементного множества.

      Указание. Число Каталана есть число ломаных, идущих из (0,0) в (2n,0) шагами (1,1) и (1,-1), не опускающихся в нижнюю полуплоскость, т.е. разность числа всех ломаных (которое есть число сочетаний из 2n по n) и числа ломаных, опускающихся в нижнюю полуплоскость. Последние можно описать также как ломаные, пересекающие прямую y=-1. Отразив их кусок справа от самой правой точки пересечения относительно указанной прямой, мы установим взаимно однозначное соответствие между ними и ломаными из (0,0) в (2n,-2).

Другие записи

10.06.2016. 2.1. Размещения с повторениями
  Здесь собраны задачи, в которых требуется получить один за другим все элементы некоторого множества.   2.1.1. Напечатать все последовательности длины k из чисел 1..n. Решение. Будем печатать…