快樂地打牢基礎(11)——組合數學

一、兩個原理


加法原理

若完成一件事的的方法有nn類,其中第ii類方法的包括mim_i種不同的方法,且這些方法互不重合,則完成這件事共有:N=m1+m2+...+mnN= m_1+m_2+...+m_n種不同的方法。

乘法原理(分佈計數原理)

若完成一件事需要nn個步驟,其中第ii個步驟有mim_i種不同的完成方法,且這些步驟互不干擾,則完成這件事共有:N=m1×m2×...×miN = m_1 \times m_2\times...\times m_i中不同的方法。

兩個原理的區別:一個與分類有關,一個與分佈有關;加法原理是"分類完成",乘法原理是"分步完成"。

二、排列及其公式


1.線排列

  • Ⅰ.定義:一般地,從nn個不同的元素中,取出m(mn)m(m\leq n)個元素按照一定的順序拍成一列,叫做從nn個不同的元素中取出mm個元素的一個線排列。從nn個不同元素中取出mm個元素的所有線排列的個數,叫做從nn個不同元素中取出mm個元素的排列數,用符號A(P)(n,m)A(P)(n,m)或者A(P)nmA(P)^m_n表示。

  • Ⅱ.排列數公式:Anm=n(n1)(n2)...(Nm+) n!(nm)!A_n^m = n(n-1)(n-2)...(N- m+1) =\frac{n!}{(n-m)!}

  • 全排列:從nn個不同的元素中取出nn個元素的一個線排列,叫做nn個元素的全排列數,用AnnA_n^n來表示。此時,Ann=n(n1)×(n2)×..×3×2×1=n!.A_n^n = n(n-1)\times (n-2)\times..\times3\times2\times1=n!.

2.相異元素可重排列

nn個不同元素中可以重複地選出mm個元素的排列,叫做相異元素的可重複排列。其排列總數爲nmn^m

3.不全相異元素的排列

如果在nn個元素中,有n1n_1個元素彼此相同,有n2n_2和元素彼此相同…有nmn_m彼此相同,並且n1+n2+...+nm=nn_1+n_2+...+n_m=n,則這nn個元素的全排列叫做不全相異元素的全排列。

其排列數公式爲:n!n1!×n2!×...×nm!{\frac{n!}{n_1!\times n_2!\times ...\times n_m!}}

【引例】把3個相同的黃球,2個相同的藍球,4個相同的白球排成一排,問:有多少種不同的排法?
解:符合不全相異元素的排列,使用不全相異元素的排列公式:(3+2+4)!3!×2!×4!=1269\frac{(3+2+4)!}{3!\times2!\times4!}=1269種。

4.圓排列

nn個不同元素中選取出mm個元素,部分首尾地排成一個圓圈的排列叫做圓排列,其排列方案數爲:Anmm=n!m×(nm)!{\frac{A_n^m}{m}=\frac{n!}{m\times(n-m)!}}

三、組合及其公式


1.非重組合

  • Ⅰ.定義: 一般地,從nn個不同的元素中,取出mmnm(m\leq n)個元素,不允許元素重複,不考慮次序,叫做從nn個不同的元素中取出mm個元素的一個非重組合;從nn個不同元素中取出mmnm(m\leq n)個元素的所有組合的個數,叫做從nn個不同個元素中取出mm個元素的組合數,用符號CnmC_n^m表示。根據乘法原理(分佈計數原理)可知:Anm=Cnm×AmmA_n^m = C_n^m\times A_m^m
  • Ⅱ.組合數公式:Cnm=AnmAmm=n(n1)(n2)...(nm+1)m!=n!m!(nm)!(n,mN)C_n^m = \frac{A_n^m}{A_m^m} = \frac{n(n-1)(n-2)...(n-m+1)}{m!}=\frac{n!}{m!(n-m)!}(n,m\in N^{*})
  • Ⅲ.組合數的三個性質:
    1、Cnm=CnnmC_n ^ {m}=C_n^{n-m},規定:Cn0=1,Cnn=1C_n^0=1,C_n^n = 1
    2、Cn+1m=Cnm+Cnm1C_{n+1}^{m}=C_n^m+C_n^{m-1}
    3、Cnm=nm+1m×Cnm1C_n ^ {m} = \frac{n- m + 1}{m}\times C_n^{m-1}

2.可重複組合

nn個不同元素中,取出rr個元素組成一個組合,且允許這rr個元素重複使用(一般rnr\leq n,但也允許r>nr >n),則稱這樣的組合爲可重複組合,器組合數記爲Hn,rHn,r=Cn+r1rH(n,r),H(n,r) = C_{n+ r - 1}^{r}

3.二項式定理

(a+b)n=k=0nCnkankbk(a+b)^n = \displaystyle\sum_{k= 0}^nC_n^ka^{n-k}b^k

【例題1】luogu P1313 計算係數 (NOIP 2011)
題意
給定一個多項式(ax+by)k(ax + by)^k,請求出多項式展開後xn×ymx^n \times y^m項的係數。
思路
直接二項式定理分解。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;

const int Max = 1e4 + 10;
const int mod = 10007;

ll qpow(ll a,ll b){
    int res = 1;
    while(b){
        if(b & 1){
            res = res * a % mod;
        }
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}
int c[Max] = {0};
int main(){
    ll a,b,k,n,m;
    ll ans = 1;
    scanf("%lld %lld %lld %lld %lld",&a,&b,&k,&n,&m);
    c[1] = k % mod;
    for(int i = 2; i <= k; i++){
        c[k - i] = c[i] = (k - i + 1) % mod * c[i-1] % mod  * qpow(i,mod-2) % mod;
    }
    ans  = c[m] % mod * qpow(a,n) % mod * qpow(b,m) % mod;
    printf("%lld\n",ans);

}

【例題】luogu P1066 2k2^k進制數

題意
rr是個2k2^k 進制數,並滿足以下條件:

(1)rr至少是個22位的2k2^k 進制數。

(2)作爲2k2^k 進制數,除最後一位外,rr的每一位嚴格小於它右邊相鄰的那一位。

(3)將rr轉換爲22進制數qq後,則qq的總位數不超過ww

在這裏,正整數k(1k9)k(1≤k≤9)w(k<W30000)w(k<W≤30000)是事先給定的。

問:滿足上述條件的不同的 rr 共有多少個?
思路

四、多重集


1.多重集的排列數

多重集是指包括重複元素的廣義集合。設S={n1a1n2a2,n3a3,...,nkak}S = \{n_1·a_1,n_2·a_2,n_3·a_3,...,n_k·a_k\}是由n1n_1a1a_1,n2n_2a2a_2,n3n_3a3a_3,…,nkn_kaka_k組成的多重集。
SS的全排列個數爲:
n!n1!n2!...nk!\frac{n!}{n_1!n_2!...n_k!}

2.多重集的組合數

S={n1a1n2a2,n3a3,...,nkak}S = \{n_1·a_1,n_2·a_2,n_3·a_3,...,n_k·a_k\}是由n1n_1a1a_1,n2n_2a2a_2,n3n_3a3a_3,…,nkn_kaka_k組成的多重集。設整數rni([1,k])r\leq n_i(\forall\in[1,k])。SS中取出rr個元素組成一個多重集(不考慮元素的順序),產生的不同多重集的數量爲:
Ck+r+1k1C_{k+r+1}^{k-1}

證明:
原問題等價於統計下列集合的數量:{x1a1x2a2,x3a3,...,xkak}\{x_1·a_1,x_2·a_2,x_3·a_3,...,x_k·a_k\},其中I=1kxi=r\sum^k_{I= 1}x_i=r並且xinix_i\leq n_i。因爲rnir \leq n_i,必定有xinix_i \leq n_i,所以只需要考慮I=1kxi=r\sum^k_{I= 1}x_i=r這一條件。

故原問題等價於rr個0,k1k-111構成的全排列數——k1k-111rr00分成kk組,每組的00的數量對應xix_i。而多重集{r0,(k1)1}\{r·0,(k-1)·1\}的全排列數爲:
(r+k1)!r!(k1)!=Ck+r1r=Ck+r1k1\frac{(r+k-1)!}{r!(k-1)!}=C_{k+r-1}^{r}=C_{k+r-1}^{k-1}

五、Lucas定理


作用: 利用模運算快速求出二項式係數C(n,m),適用於不用模運算就無法求出其結果的、具有非常大的n和m的二項式係數。

pp是質數,則對於任意整數1mn1 \leq m\leq n,有:
Cnm=Cn mod pm mod p×Cn/pm/p(mod p)C_n^m = C_{n \ mod\ p}^{m\ mod \ p}\times C_{n/p}^{m/p}(mod\ p)
也就是把nnmm表示成pp進制數,對pp進制下的每一位分別計算組合數,最後再乘起來。
【例題3】一本通OJ 1650:組合
題意

給出組合數 C(n,m) 表示從 n 個元素中選出 m 個元素的方案數。例如 C(5,2)=10,C(4,2)=6。可是當 n,m 比較大的時候,C(n,m) 很大。於是 xiaobo 希望你輸出 C(n,m) mod p 的值。

思路
求組合數,但因爲組合數過大,並且需要取模,所以考慮Lucas定理。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;

ll n,m,p,cas;

ll qpow(ll a,ll b,ll mod){
	ll res = 1;
	while(b){
		if(1 & b){
			res  = res * a % mod;
		}
		a = a * a % mod;
		b >>= 1; 
	}
	return res;
}

ll C(ll n,ll m,ll mod){
	if(m > n)
		return 0;
	if(m == 1)
		return n;
	if(n == m || m == 0)
		return 1;
//	ll res1 = 1,res2 = 1,res3 = 1;
//	for(int i = 1; i <= n; i++){
//		res1 = res1 * i % mod;
//		if(i <= m)
//		res2 = res2 * i % mod;
//		if(i <= n - m)
//		res3 = res3 * i % mod;
//	} 
//	return res1 * qpow(res2 * res3 % mod , mod - 2,mod) % mod;
	ll res1 = 1,res2 = 1,res3 = 1;
	for(int i = n - m + 1; i <= n; i++)
		res1 = res1 * i % mod;
	for(int i = 1; i <= m; i++)
		res2 = res2 * i % mod;
	return res1 * qpow(res2  , mod - 2,mod) % mod;
}
ll Lucas(ll n,ll m, ll mod){
	if(!m)
		return 1;
	return C(n % mod,m % mod,mod) * Lucas(n / mod , m / mod, mod) % mod;
}
int main(){
	scanf("%lld",&cas);
	while(cas--){
		scanf("%lld %lld %lld",&n,&m,&p);
		printf("%lld\n",Lucas(n,m,p));
	}
	return 0;
} 

六、Catalan數列


給定 nn00nn個1,它們按照某種順序排成長度爲2n2n的序列,滿足任意前綴中00的個數都不少於11的個數的序列的數量爲Catn=1n+1C2nnCat_n = \frac{1}{n+1}C_{2n}^{n}

證明:nn00nn11任意排成一個長度爲2n2n的序列SS,若SS不滿足任意前綴中00的個數都不少於11的個數,則存在一個最小的位置2p+1[1,2n]2p+1\in [1,2n],使得S[12p+1]S[1~2p+1]中有pp00,p+1p+111。而把S[2p+22n]S[2p+2~2n]中的所有數位取反後,包含np1n-p-100npn-p11.於是我們得到了有 n1n-100n+1n+111 排成的序列。
同理,令n1n-100n+1n+111隨意排成一個長度爲2n2n的序列SS,也必定存在一個最小的位置2p+12p+1,使得S[12p+1]S[1~2p+1]中有pp00p+1p+111。把SS後面剩下的一半取反,就得到了由nn00nn11排成的、存在一個前綴0011多的序列。

因此,以下兩種序列構成一個雙射:

  • Ⅰ.由nn00nn11排成的、存在一個前綴0011多的序列。
  • Ⅱ.由n1n-100n+1n+111排成的序列。
    根據組合數的定義,後者顯然有C2nn1C_{2n}^{n-1}個。
    綜上所述,由nn00nn11排成的、任意前綴中00都不少於11的序列數量爲:
    C2nnCn12n=(2n)!n! n!(2n)!(n1)!(n1)!=1n+1C2nn=CatnC_{2n}^{n}-C_{n-1}^{2n} = \frac{(2n)!}{n!\ n!}-\frac{(2n)!}{(n-1)!(n-1)!}=\frac{1}{n+1}C_{2n}^{n} = Cat_n

與Catalan數相關的問題:

  • Ⅰ.nn個左括號和nn個右括號組成的合法括號的數量爲CatnCat_n
  • Ⅱ.1,2,...n1,2,...n經過一個棧,形成的合法出棧序列的數量爲CatnCat_n
  • Ⅲ.nn個節點構成的不同二叉樹的數量爲CatnCat_n
  • Ⅳ.在平面直角座標系中,每一步只能向上或者向右走,從0,0(0,0)走到nn(n,n)並且除兩個端點外不結束直線y=xy=x的線路數量爲2Catn2Cat_n
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章