комбинаторика — Разбить число
Имеются 11 точек, расположенных в ряд. Сколькими способами можно расставить между ними 3 черточки? Решение: Поставим между точками цифры .0.1.2.3.4.5.6.7.8.9. Поставив три черточки, мы отмечаем трехзначное число, цифры которого идут в возрастающем порядке, количество таких чисел равно(1098) / (123)=120. Ответ к задаче: 120 разбиений. Аналогичная задача Сколькими способами можно разбить число 11 на (k+1) слагаемых (где k=0,1,2. 9)? Указание: Ответ нужно записать так же,как и в предыдущей задаче.
задан 14 Мар ’14 18:39
1 ответ
В задаче про три чёрточки я бы рассуждал проще: есть 10 мест, и мы выбираем из них 3 для расположения чёрточек. Это сразу даёт ответ $%C_<10>^3$%, то есть $%10\cdot9\cdot8/3!$%, просто по определению. Задача о числах с возрастающими цифрами сама по себе более сложна, хотя к этому сводится. Надо ещё заметить, что тут лучше говорить не о трёхзначных числах, а о трёхразрядных. Скажем, 047 — это двузначное число, записанное как трёхразрядное.
Теперь по поводу задачи с разбиением числа 11 на слагаемые. Из того, что было сказано, я понял, что порядок слагаемых учитывается, то есть 6+5 и 5+6 считаются разными способами. В этом случае задача решается просто, и она аналогична задаче с чёрточками в следующем смысле. Пусть имеется 11 палочек (вместо точек), и между ними ставятся знаки + вместо чёрточек. Тогда, если мы ставим три «плюсика», число 11 разбивается при этом на 4 слагаемых. Например, записи |||+|+||||||+| соответствует выражение 3+1+6+1. Из сказанного следует, что разбить число $%11$% на $%k+1$% слагаемое можно $%C_<10>^k$% способами. После этого остаётся просуммировать сочетания подобно тому, как это было в одной из предыдущих задач. Здесь также надо опираться на то, что сумма всех сочетаний (по $%k$% от $%0$% до $%10$%) равна $%2^<10>$%. Поскольку случай $%k=10$% не входит, из указанного количества вычитается единица.
Источник
Нахождение количества разбиений числа на слагаемые
Задача: |
По заданному числу [math]n[/math] найти количество его различных разбиений на положительные слагаемые [1] [math] m_0 + m_1 + m_2 + \ldots + m_k = n [/math] так, что при всех [math] i\colon m_i \leqslant m_ [/math] . |
Содержание
Алгоритм за O(N 3 ) [ править ]
Пусть [math]P(n, m, k)[/math] — количество разбиений числа [math]n[/math] на [math]m[/math] слагаемых, каждое из которых не превосходит [math]k[/math] . Имеет место следующее рекуррентное соотношение:
[math]P(n, m, k) = \left \<\begin
Рассмотрим множество разбиений числа [math]n[/math] на [math]m[/math] слагаемых, каждое из которых не больше [math]k[/math] . Разделим его на две непересекающиеся группы — в первой будут все разбиения, которые не содержат в качестве старшего слагаемого [math]k[/math] . Таких разбиений [math]P(n, m, k — 1)[/math] . Во второй — все разбиения со старшим слагаемым [math]k[/math] . Их столько же, сколько разбиений числа [math]n — k[/math] на [math]m — 1[/math] слагаемое, каждое из которых не больше [math]k[/math] , то есть [math]P(n — k, m — 1, k)[/math] .
Количество всех разбиений числа равно [math]\sum\limits_^nP(n, i, n)[/math] . Реализация данного алгоритма методом динамического программирования с меморизацией будет иметь асимптотику [math]O(n^<3>)[/math] .
Алгоритм за O(N 2 ) [ править ]
[math]P(n,k) = \left \< \begin
Заметим, что нам не нужно считать количество слагаемых [math]m[/math] в разбиении. Достаточно посчитать [math]P(n, k)[/math] — количество разбиений числа [math]n[/math] на произвольное количество слагаемых, каждое из которых не больше [math]k[/math] . Рассмотрим множество таких разбиений. Разделим его на две непересекающиеся группы. В первую войдут те разбиения, в которых отсутствует слагаемое [math]k[/math] . Очевидно, таких разбиений [math]P(n, k — 1)[/math] . Во второй группе — те разбиения, в которые слагаемое [math]k[/math] вошло. Их количество совпадает с количеством разбиений числа [math]n — k[/math] на слагаемые, каждое из которых не превосходит [math]k[/math] , и равно [math]P(n — k, k)[/math] .
Количество всех разбиений числа [math]n[/math] равно [math]P(n,n)[/math] . Асимптотика [math]O(n^<2>)[/math] .
Алгоритм за O(N 3/2 ) [ править ]
Рассмотрим алгоритм нахождения количества разбиений числа [math]n[/math] на слагаемые, который работает за [math] O(n \sqrt
Итак, обозначим количество таких разбиений за [math] p(n) [/math] .
Рассмотрим следующее бесконечное произведение:
[math] (1 + x + x^2 + \dots)(1 + x^2 + x^4 + \dots) \dots (1 + x^k + x^ <2k>+ \dots) \dots [/math]
После раскрытия скобок каждый член произведения получается в результате умножения мономов (одночленов), взятых по одному из каждой скобки. Если в первой скобке взять [math]x^
Можно увидеть, что [math] x^n [/math] встретится в полученной бесконечной сумме столько раз, сколькими способами можно представить [math]n[/math] как сумму [math]m_1 + 2m_2 + 3m_3 + . [/math] Каждому такому представлению отвечает разбиение числа [math]n[/math] на [math]m_1[/math] единиц, [math]m_2[/math] двоек и т.д. Таким образом, очевидно, получаются все разбиения, так как из первой скобки мы можем взять любое [math]x^
Посмотрим теперь на выражения в скобках. Каждое из них — бесконечная геометрическая прогрессия. Полагая [math]0 \leqslant x \lt 1[/math] , по формуле ее суммирования:
[math]1 + x + x^2 + x^3 + \dots = \frac<1><1 - x>[/math] , [math]1 + x^2 + x^4 + x^6 + \dots = \frac<1><1-x^2>[/math] [math]\dots[/math] [math]1 + x^k + x^ <2k>+ x^ <3k>+ \dots = \frac<1><1-x^k>[/math] [math]\dots[/math]
Запишем теперь производящую функцию последовательности [math]p(n)[/math] :
[math]p(0) + p(1) x + p(2) x^2 + p(3) x^3 + \dots = \frac<1><(1-x)(1-x^2)(1-x^3)\dots>[/math] [math](1)[/math]
Рассмотрим произведение [math](1-x)(1-x^2)(1-x^3). [/math] , т.е. знаменатель правой части формулы [math](1)[/math] . Раскрывая в нём скобки, получим следующий результат:
[math](1 — x)(1 — x^2)(1 — x^3) . = 1 — x — x^2 + x^5 + x^7 — x^ <12>— x^ <15>+ x^ <22>+ x^ <26>— x^ <35>— x^ <40>+ . [/math]
Показатели степеней в правой части — пятиугольные числа [2] , т.е. числа вида [math](3q^2 \pm q)/2[/math] , а знаки при соответствующих мономах равны [math](-1)^q[/math] . Исходя из этого наблюдения, Эйлер предположил, что должна быть верна следующая теорема, впоследствии названная его именем.
Теорема (Пентагональная теорема Эйлера): | ||
Доказательство: | ||
[math]\triangleright[/math] | ||
Раскроем в этом произведении первые [math]22[/math] скобки. Мы получим выражение где в квадратной скобке точками обозначены слагаемые, содержащие [math]x[/math] в более высокой степени, чем [math]22[/math] . Не будем выписывать эти члены, так как после умножения квадратной скобки на [math]1-x^<23>[/math] , [math]1-x^<24>[/math] и т.д. они изменятся. Выписанные же члены больше меняться не будут. Поэтому, если раскрыть все скобки, то получится бесконечный ряд, первые члены которого имеют вид Анализируя этот ряд, Эйлер пришел к выводу, что, если превратить бесконечное произведение в ряд, то в этом ряду отличны от нуля лишь слагаемые, вида [math](-1)^q x^<\frac<3q^2+q><2>>[/math] , где [math]q[/math] — натуральное число. При раскрытии скобок в исходном произведении слагаемое [math]\pm x^N[/math] встретится столько раз, сколькими способами можно разбить число [math]N[/math] на различные слагаемые. При этом, если число слагаемых четно, то появляется [math]x^N[/math] , а если это число нечетно, то появляется [math]-x^N[/math] . Например, разбиению [math]12=5+4+2+1[/math] соответствует слагаемое [math](-x^5)(-x^4)(-x^2)(-x^1)=x^<12>,[/math] а разбиению [math]12=5+4+3[/math] — слагаемое [math](-x^5)(-x^4)(-x^3)=-x^<12>[/math] . Таким образом, коэффициент при [math]x^N[/math] в разложении [math]A[/math] в ряд равен разности между количеством разбиений [math]N[/math] на четное число различных слагаемых и количеством разбиений [math]N[/math] на нечетное число различных слагаемых. Тогда теорему можно переформулировать следующим образом:
Умножим обе части равенства [math](1)[/math] на [math]\prod\limits_ [math] ( p(0) + p(1) x + p(2) x^2 + \dots)(1 — x — x^2 + x^5 + x^7 — x^ <12>— x^ <15>+ \dots) = 1 [/math] [math](2)[/math] Начнем раскрывать скобки, для наглядности мономы с одинаковыми степенями [math]x[/math] пишем друг под другом: [math] p(0) + p(1)x + p(2) x^2 + p(3) x^3 + p(4) x^4 + p(5) x^5 + p(6) x^6 + \dots [/math] [math] — p(0)x — p(1) x^2 — p(2) x^3 — p(3) x^4 — p(4) x^5 — p(5) x^6 — \dots [/math] [math] — p(0) x^2 — p(1) x^3 — p(2) x^4 — p(3) x^5 — p(4) x^6 — \dots [/math] [math]+ p(0) x^5 + p(1) x^6 + \dots [/math] Так как [math]p(0) = 1[/math] , то оно сокращается с единицей справа. Так что, чтобы выражение [math](2)[/math] было удовлетворено при любом [math]x[/math] , все коэффициенты должны быть равны [math]0[/math] . Поэтому: [math] p(1) = p(0) [/math] [math] p(2) = p(1) + p(0) [/math] [math] p(3) = p(2) + p(1) [/math] [math] p(4) = p(3) + p(2) [/math] [math] p(5) = p(4) + p(3) — p(0) [/math] [math]. [/math] Получаем формулу Эйлера, позволяющую последовательно находить числа [math]p(n)[/math] : [math] p(n) = p(n-1) + p(n-2)+ . + (-1)^ Асимптотика [math] O(n \sqrt Источник |