1. 程式人生 > 其它 >排列組合、容斥原理、卡特蘭數、盧卡斯定理

排列組合、容斥原理、卡特蘭數、盧卡斯定理

一、原理

1.加法原理(分類計數原理)

如果完成一件事有n類方法,第一類方法有m1種方案,第二類方法有m2種方案......

那麼完成這件事有(m1+m2+m3+...+mn)種方案

2.乘法原理(分步計數原理)

如果完成一件事有n步,第一步有m1種方案,第二步方法有m2種方案......

那麼完成這件事有(m1*m2*m3*...*mn)種方案

二、排列與組合

1.排列

(1)定義:從n個不同的元素中取出m(m≤n)個元素,按照一定的順序排成一列,叫做從n個不同元素中取出m個元素的一個排列

(2)表示方法:從n個數中取出m個數進行排列的方案數用符號A(n,m)表示

(3)公式:A(n,m) = n*(n-1)*(n-2)*...*(n-m+1) = n!/(n-m)! 

2.組合

(1)定義:從n個不同元素中取出m(m≤n)個元素的所有組合的個數,叫做從n個不同元素中取出m個元素的組合數

(2)表示方法:從n個數中取出m個數的方案數用符號C(n,m)表示

(3)公式:C(n,m) = A(n,m)/A(m,m) = n!/(m!(n-m)!)

3.策略

(1)特殊元素和特殊位置優先策略

例:由0,1,2,3,4,5可以組成多少個沒有重複數字的五位奇數?

由於末位和首位有特殊要求,應該優先安排,以免不合要求的元素佔了這兩個位置。

先排末位共有C(3,1),然後排首位共有C(4,1),最後排其它位置共有A(4,3)。

由乘法原理得ans = C(3,1)*C(4,1)*A(4,3)

(2)相鄰元素捆綁策略0

例:7人站成一排 ,其中甲乙相鄰且丙丁相鄰, 共有多少種不同的排法?

先將甲乙兩元素捆綁成整體並看成一個複合元素,同時丙丁也看成一個複合元素,再與其它元素進行排列,同時對相鄰元素內部進行自排。

由乘法原理可得共有A(5,5)*A(2,2)*A(2,2)種不同的排法。

(3)不相鄰問題插空策略

例:一個晚會的節目有4個舞蹈,2個相聲,3個獨唱,舞蹈節目不能連續出場,則節目的出場順序有多少種? 

分兩步進行:

第一步,排列2個相聲和3個獨唱,共有A(5,5)種方案。

第二步,將四種舞蹈插入第一步排好的5個元素中間包含首尾兩個空位A(6,4)共有種不同的方法。

節目的不同順序共有A(5,5)*A(6,4)種。

提示:不相鄰問題通常用插空法:把要求不相鄰的元素放在一邊,先排其他元素,再將不相鄰的元素插在已經排好的元素之間的空位上。

(4)定序問題倍縮空位插入策略

例:7人排隊,其中甲乙丙3人順序一定,共有多少不同的排法?

(倍縮法)對於某幾個元素順序一定的排列問題,可先把這幾個元素與其他元素一起進行排列,然後用總排列數除以這幾個元素之間的全排列數,則共有不同排法種數是A(7,7)/A(3,3)。

(5)排列問題求冪策略

例:把6名實習生分配到7個車間實習,共有多少種不同的分法?

完成此事共分六步:把第一名實習生分配到車間有7種分法,把第二名實習生分配到車間也有7種分法。

依此類推,由乘法原理共有7^6種不同的排法。

(6)環排問題線排策略

例:8人圍桌而坐,共有多少種坐法? 

圍桌而坐與坐成一排的不同點在於,坐成圓形沒有首尾之分,所以固定一人,並從此位置把圓形展成直線其餘7人共有(8-1)!=7!種排法

一般地,n個不同元素作圓形排列,共有(n-1)!種排法

如果從n個不同元素中取出m個元素作圓形排列,共有A(n,m)/m種排法

(7)多排問題直排策略

例:8人排成前後兩排,每排4人,其中甲乙在前排,丙在後排,共有多少排法?

8人排前後兩排,相當於8人坐8把椅子,可以把椅子排成一排。

前排有2個特殊元素,方案數為A(4,2),

後排有1個特殊元素,方案數為A(4,1),

其餘的5人在5個位置上任意排列,方案數為A(5,5)。

共有A(4,2)*A(4,1)*A(5,5)種方案。

(8)排列組合混合問題先選後排策略

例:有5個不同的小球,裝入4個不同的盒內,每盒至少裝一個球,求共有多少不同的裝法?

第一步:從5個球中選出2個組成複合元共有C(5,2)種方法,

第二步:再把4個元素(包含一個複合元素)裝入4個不同的盒內有A(4,4)種方法。

根據乘法原理裝球的方法共有C(5,2)*A(4,4)。

(9)平均分組問題除法策略

例:6本不同的書平均分成3堆,每堆2本共有多少分法?

分三步取書得C(6,2)*C(4,2)*C(2,2)種方法,但這裡出現重複計數的現象

每種方案計算了A(3,3)次,故最終答案為C(6,2)*C(4,2)*C(2,2)/A(3,3)。

(9)重排列

例:由四面紅旗,三面藍旗,二面黃旗,五面綠旗排成的一排彩旗有多少種?

將14面彩旗排成一個排列,方案數A(14,14),

其中紅旗之間每種排列等價,方案數A(4,4)。

ans = A(14,14)/(A(4,4)*A(3,3)*A(2,2)*A(5,5))

4.常用結論

(1)將一個長度為n的序列劃分成m段非空子串的方案數為C(n-1,m-1)

相當於在n-1個空位中選擇m-1個插入隔板的方案數

(2)將一個長度為n的序列劃分成m段可空子串的方案數為C(n+m-1,m-1)

相當於在m+n-1個空位中選擇m-1個插入隔板的方案數

例題:BZOJ 2729 [HNOI2012]排隊

三、容斥原理

1.單步容斥

有的時候合法的方案數不好求,我們可以用方案全集減掉不合法的方案數,就是答案。

(單步容斥一般結合DP等使用,隱藏較深,形式通常也比較難看出)

例題:NOI2010 能量採集

2.多步容斥

有時候剪掉不合法方案的時候會順便減掉一些合法方案;將這些合法方案加回去,又會加回去一些不合法方案;反反覆覆,就是多步容斥。

(多步容斥的形式一般比較好看出,有時候會在每一項後面乘一個組合數,多注意式子)

比如說這個式子:

例題:BZOJ 1042 HAOI2008 硬幣購物

四、卡特蘭數

1.定義

在二維平面上從點(0,0)走到點(n,n),每次可以向右走1單位或向上走1單位,求方案數。

相當於用n個右和n個上組成一個長度為2n的序列,方案數C(2n,n)

在二維平面上從點(0,0)走到點(n,n),每次可以向右走1單位或向上走1單位,要求不能跨越直線y=x,求方案數

如果某個方案跨越了直線y=x那麼他一定觸碰了直線y=x+1

那麼我們將這條路徑從起點到第一次觸碰的點為止的部分都沿直線y=x+1翻轉,就等價對映到了一條從(-1,1)走到(n,n)的路徑。

那麼不合法的方案數就等於從點(-1,1)走到(n,n)的方案數,即C(2n,n-1)

答案就是C(2n,n) - C(2n,n-1),這個數列被稱為卡特蘭數。

2.公式

h(n) = C(2n,n)-C(2n,n-1)

   = C(2n,n)/(n+1)

   = h(n-1)*(4*n-2)/(n+1)

   = h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)*h(0)

(前幾項分別為1,1,2,5,14,42,...)

3.應用

(1)出棧次序:一個棧的進棧序列是1,2,3,4...,n,求有多少個不同的出棧序列?

(2)三角剖分問題:一個正n+2邊形,連線n-1條不相交的對角線的方案數。

(3)n個節點沒有標號的二叉樹一共有多少種?

答案都是h(n)

類似的結論實在太多了,很難一一記住,建議熟記卡特蘭數列的前幾項,當遇到題目卡住的時候不妨打個表看看前幾項,如果吻合說明是卡特蘭數列

五、盧卡斯定理(Lucas)

1.用途

Lucas 定理用於求解大組合數取模的問題,其中模數必須為素數。
正常的組合數C(n,m)運算,當n比較小的時候,可以通過遞推公式求解。
n很大,模數p為質數,且n<p時,此時可以利用乘法逆元來解決問題。
但是當模數是一個不大的質數的時候,即n>p時,公式中某個分母上某個數可能不存在逆元(比如分母上某個數是 p的倍數),此時就不能簡單地通過遞推求解來得到答案,需要用到Lucas定理。

2.求解方式

對於質數p,有

C(n,m) C(n/p,m/p) * C(n mod p,m mod p) (mod p)

上式中,n mod pm mod p一定小於p,可以直接求解,C(n/p,m/p)可以繼續用 Lucas 定理求解。

這也就要求p的範圍不能夠太大,一般在10^5左右。

邊界條件:當m = 0的時候,返回1。
時間複雜度為O(f(n) + g(n)log2(n)),其中f(n)為預處理組合數的複雜度,g(n)為單次求組合數的複雜度。

3.參考程式碼

long long Lucas(long long n,long long m,long long p){
    if(m == 0) return 1;
    return (C(n % p,m % p,p) * Lucas(n / p,m / p,p)) % p;
}

4.Lucas 定理證明

我們先考慮組合數C(p,m),有C(p,m) = p!/m!*(pm)!

對分子進行質因子分解,p的次數為1,則當m = 0m=p時,分母中才能分解出質因子p
因此有:

我們知道二項式

結合(1)式,我們讓兩邊對p取模,得到

 

我們令,其中gcd(a,p)=1,gcd(b,p)=1,結合費馬小定理,則有

特別的,。

對於二項式(1+x)^n,我們知道C(n,m)即為x^m項的係數,利用上面的結論,我們可以得到:

所以有:

對於非負數m [0,n],可以寫成m = k*p+r,則

k = n/p
r = n mod p

我們在(2)式中考慮一下C(n,m)的組成,在(2)式的右邊,在乘號的兩邊我們可以找到唯一的組合與之對應。
因此有