排列組合、容斥原理、卡特蘭數、盧卡斯定理
一、原理
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個插入隔板的方案數
三、容斥原理
1.單步容斥
有的時候合法的方案數不好求,我們可以用方案全集減掉不合法的方案數,就是答案。
(單步容斥一般結合DP等使用,隱藏較深,形式通常也比較難看出)
例題:NOI2010 能量採集
2.多步容斥
有時候剪掉不合法方案的時候會順便減掉一些合法方案;將這些合法方案加回去,又會加回去一些不合法方案;反反覆覆,就是多步容斥。
(多步容斥的形式一般比較好看出,有時候會在每一項後面乘一個組合數,多注意式子)
比如說這個式子:
四、卡特蘭數
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 p和m 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!*(p−m)!
對分子進行質因子分解,p的次數為1,則當m = 0或m=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)式的右邊,在乘號的兩邊我們可以找到唯一的組合與之對應。
因此有