【數學】組合數學 - 排列組合

purinliang發表於2024-04-12

父級頁面:【數學】組合數學

排列

組合

可重排列

可重組合

隔板法

盒子可以為空

隔板法:x個相同的小球,有y個不同的盒子,每個盒子可以為空,求有多少種方案數?把y個不同的盒子視作y-1個不同的隔板,然後把小球視作不同的,全排列有 \(A_{x+y-1}^{x+y-1}\) 種,然後除以隔板的全排列(隔板之間沒有區別),再除以小球的全排列(小球之間也沒有區別),最後在兩側再加入兩個隔板,然後兩個隔板之間的就是這個盒子分配到的球數,也就是 \(C_{x+y-1}^{x}\)

隔板法2:Stars and Bars,x個相同的小球,y個不同的盒子,每個盒子可以為空,求有多少種方案數?用y-1個隔板去分隔小球,分隔得到y段可能為空的區間,這個區間就是原本的盒子。由於隔板是相同的,小球也是相同的,所以就是隔板數y-1和小球數x的和,選出y-1個位置來放隔板或者選出x個位置來放小球。(不同的盒子由其順序確定)。

**注意這裡是 \(C_{x+y-1}^{x}\) 或者 \(C_{x+y-1}^{y-1}\) ,不要寫成 \(C_{x+y-1}^{x-1}\) 了!或者說就不應該想象成盒子數y,應該直接就用隔板數y-1就好了。

盒子可以為空的問題也可以先借y個小球過來,然後用下文盒子非空的方法做,顯然是 x+y -1個小球之間選y-1個隔板,然後最後把虛空的小球還回去。

把小球數記為n,盒子數記為m,那麼等價於求方程 \(x_1+x_2+x_3+\cdots+x_m = n, \; x_i \geq 0\) 的解。

盒子必須非空

x個相同的小球,y個不同的盒子,每個盒子至少要分到1個小球。這個問題比上面的簡單得多,只需要找y-1個插板插到小球之間的x-1個空位裡面,並且一個空位裡面最多隻有一個插板,所以就是 \(C_{x-1}^{y-1}\)

但是也可以轉化為上面那個問題,先取出y個小球各放1個進盒子裡面,然後用盒子可以為空的方法做。

把小球數記為n,盒子數記為m,那麼等價於求方程 \(x_1+x_2+x_3+\cdots+x_m = n, \; x_i \geq 1\) 的解。

這個方法可以進一步推廣到盒子內至少有k個小球,那麼要借y*k個虛空小球,然後最後再把他們都還回去。當然每個盒子的小球的下限甚至沒必要一樣。設每個盒子的下限是k_i,那麼就先把 sum k_i 個小球都分別放到盒子裡面再用盒子非空的方法去做。

整數分拆

小球也相同,盒子也相同,可以有空盒子。相當於整數分拆的問題,不太好算,可以用生成函式去搞

例如4的分拆有4, 3+1, 2+2, 2+1+1, 1+1+1+1, p(4) = 5

\[(1+x+x^2+x^3+...)*(1+x^2+x^4+x^8+...)*(1+x^3+x^6+x^9+...)*... \]

求上面這個多項式的第n項的結果就是n的整數分拆。其中第i個括號表示拆分出多少個數字i,不重不漏。

利用生成函式可以求出諸如:

差分拆:每個數字最多拆出現一次:

4的分拆只有4, 3+1

生成函式就是下面(因為相同的數字要麼出現0次要麼出現1次,所以變成了二項式):

\[(1+x)*(1+x^2)*(1+x^3)*... \]

奇分拆:拆出來的都是奇數:

4的分拆只有:3+1, 1+1+1+1

\[(1+x+x^2+x^3+...)*(1+x^3+x^6+x^9+...)*(1+x^5+x^{10}+x^{15}+...)*... \]

據說奇分拆和差分拆的數量是一樣的。不會證明。

常用的求和:

\(C_n^m = C _{n-1}^{m-1}+C _{n-1}^{m}\)
\(mC_n^m = nC _{n-1}^{m-1}\)

二項式定理

\(\sum\limits_{i=0}^nC_n^i=C_n^0+C_n^1+C_n^2+……+C_n^n = 2^n\)
類似求和 \(\sum\limits_{i=0}^n(-1)^iC_n^i=C_n^0-C_n^1+C_n^2-……+(-1)^nC_n^n = 0\) (奇數項求和=偶數項求和)
\(\sum\limits_{i=0}^n2^iC_n^i = 3^n\)

利用 \(C_n^mC_m^k=C_n^kC_{n-k}^{m-k}\) ,加上二項式定理,可以得到下式

\(1C_n^1+2C_n^2+3C_n^3+……+nC_n^n =n2^{n-1}\)
\(\sum\limits_{i=1}iC_n^i = \sum\limits_{i=1}C_i^1C_n^i = \sum\limits_{i=1}C_n^iC_i^1 \\ = \sum\limits_{i=1}C_n^1C_{n-1}^{i-1} = C_n^1\sum\limits_{i=1}^n C_{n-1}^{i-1} \\ = C_n^1\sum\limits_{i=0}^{n-1} C_{n-1}^i \\ = n2^{n-1} \\\)

\(1^2C_n^1+2^2C_n^2+3^2C_n^3+……+n^2C _n^n =n(n+1)2^{n-2}\)

\(\frac{C_n^1}{1}-\frac{C_n^2}{2}+\frac{C_n^3}{3}+……+(-1)^{n-1}\frac{C _n^n}{n} =1 + \frac{1}{2}+ \frac{1}{3}+……+ \frac{1}{n}\)

\((C_n^0)^2+(C_n^1)^2+(C_n^2)^2+……+(C _n^n)^2 = C_{2n}^n\)

n個球選x個染黑,黑球之間位置差至少為k的方案:在n-(x-1)(k-1)裡面選x個黑球,染黑之後在前x-1個黑球后緊跟k-1個白球,得一一對應。

圓排列:n個不同的球,取m個進行圓排列,先用組合數取出m個,然後規定圓的開頭是最小的元素,那麼剩下的元素可以任意排列,故答案為 \(C_n^m\cdot A_{m-1}^{m-1}=\frac{n!}{(n-m)!m!}\cdot(m-1)!=\frac{n!}{(n-m)!m}=\frac{A_n^m}{m}\)

錯位排列

    ll D[MAXN];
    void initD(int n) {
        ASSERT(1 <= n && n <= MAXN && n < MOD);
        D[0] = 1, D[1] = 0;
        for(int i = 2; i <= n; ++i) {
            if(i & 1) {
                D[i] = (1LL * i * D[i - 1] - 1) % MOD;
                if(D[i] < 0) D[i] += MOD;
            } else
                D[i] = (1LL * i * D[i - 1] + 1) % MOD;
        }
    }

相關文章