『筆記』組合數學

定義

簡單的定義是組合數學就是在學用來解決和組合相關問題的一個工具箱。複雜的一點的定義是,組合數學的主要內容能夠分爲四大類:計數類,生成類,證實類,設計類。數組

排列組合是組合數學中的基礎。排列就是指從給定個數的元素中取出指定個數的元素進行排序;組合則是指從給定個數的元素中僅僅取出指定個數的元素,不考慮排序。排列組合的中心問題是研究給定要求的排列和組合可能出現的狀況總數。排列組合與古典機率論關係密切。工具

排列數公式計算方法

(1)定義式優化

公式簡記爲:spa

\[A_{n}^{m}= \frac{n!}{(n-m)!} \]

組合數公式計算方法

(1) 定義式設計

公式能夠簡單記爲:blog

\[\dbinom{n}{m}=\frac{n!}{m! (n-m)!} \]

或者:排序

\[C^{m}_{n}=\frac{n!}{m! (n-m)!} \]

表示從 \(n\) 個數中選 \(m\) 個數的方案數ip

(2) 模意義get

適用於\(n\le1e9,m\le 1e5\)的較大模運算,小的也能夠數學

首先根據定義式咱們能夠將\((n-m)!\)所有消去

得出式子

\[\frac{\prod_{i=n-m+1}^{n}i}{m!}\ mod \ p \]

進而求得

\[\prod_{i=n-m+1}^{n}\times \ m!^{p-2}\ mod\ p \]

(3) 高精法

適用於答案過大時的計算

依舊是(2)中的第一個式子,經過高精乘法來實現,若是有多個相加還要加上高精加法,難度不大,好記

代碼

(4) \(Lucas\) 定理

\(Lucas\) 定理用於求解大組合數取模的問題,其中 \(p\) 必須爲素數。正常的組合數運算能夠經過遞推公式求解,但當問題規模很大,而模數是一個不大的質數的時候,就不能簡單地經過遞推求解來獲得答案,須要用到 \(Lucas\) 定理。

能夠大量減小運算量和時間

預先處理好\(0-(mod-1)\)的模意義下的階乘和逆元,求得時候\(O(1)\)代入便可

一個應用公式爲

\[C_{n}^{m}=C_{n/p}^{m/p}\times C_{n \ mod \ p}^{m\ mod\ p} \]

實際應用時的公式爲

\[Lucas(n,m)=Lucas(n/p,m/p)\times C_{n \ mod \ p}^{m\ mod\ p} \]

其中\(Lucas(n,0)=1\)利用這個公式進行返回便可

固定模數代碼

多重詢問,非固定模數代碼

其他待添加……

組合數思想方法

  • 插空法

(1)空隙內必須有值的狀況

當遇到一些有特殊限制的,而且能夠重複取的問題時,咱們能夠用這個方法進行求解。

假設一個問題,有一個數 \(g\),要求求 \(k\) 個數組成 \(g\) 的方案數

這個問題就是插空法的經典例子了,首先能夠把 \(g\) 個數想象成 \(g\) 個小球,小球之間一共有 \(g-1\) 個空隙,要把這 \(g\) 個小球分紅 \(k\) 份,即在這空隙中插上 \(k-1\) 個隔板,轉換成求插空的方案數
也就是求

\[C_{g-1}^{k-1} \]

的值

(2)空隙內能夠沒有值的狀況

假設有 $n $ 個籃球,要求分給\(k\)我的,每一個人能夠沒有籃球

那麼就是有 \(k-1\) 個隔板來插空,可是能夠同時排列在同一個空隙中,那麼就是求 \(n+k-1\) 個位置中,選出 \(k-1\) 個位置來填充

公式記爲

\[C_{n+k-1}^{k-1} \]

  • 二維求放置方案

一、\(n \times n\) 的矩陣上放置 \(n\) 個車,每一個車不相同,每行每列只能放置一個車求放置方案數

第一行有 \(n\) 種選擇:第二行有 \(n-1\) 種選擇,第三行 \(n-2\) 種選擇\(...\)\(n\) 行有一種選擇

公式爲

\[n! \]

二、\(n \times n\) 的矩陣上放置\(k\)個車,求放置方案數

\(n\) 行中選 \(k\) 行,\(n\) 列中選 \(k\)

公式爲

\[C_{n}^{k} \times C_{n}^{k} \times k! \]

爲何要有 \(k!\) 在個人理解中由於只是位置肯定了,可是每一個位置放哪個小車並不知道,因此一共共有 \(k!\) 中在上面擺放的可能

三、\(n \times m\)的矩陣上放置 \(k\) 個車,求放置方案數

合在上面的相似,即

\[C_{n}^{k} \times C_{m}^{k} \times k! \]

四、\(n \times m\)的矩陣上放置 \(k\) 個車,要求不能同行或者同列,求放置方案數(本身推得式子,可能會出錯,歡迎糾錯)

咱們能夠把\(n\)分紅兩份,在兩個矩形中找弄式子

\[\sum_{i=0}^{k}C_{n/2}^{i}\times C_{m-(k-i)}^{i}\times i! \times C_{n-n/2}^{k-i} \times C_{m}^{k-i}\times (k-i)! \]

注意此時\(0!=1\)

五、關於不規則矩陣的排列,詳情課件P1350

典型例題

P2822 [NOIP2016 提升組] 組合數問題

分析

  • 30pts 暴力枚舉,一會就溢出了

  • 70pts 運用組合公式的推論

\[C^{m}_{n}=C^{m-1}_{n-1}+C^{m}_{n-1} \]

能夠直接遞推求解,惟一要注意的是要進行初始化

\[C^{0}_{0}=C^{0}_{1}=C^{1}_{1}=1 \]

  • 90pts 運用取模防止溢出的方法加速運算

\[C^{m}_{n}\ mod\ k=C^{m-1}_{n-1}\ mod\ k+C^{m}_{n-1}\ mod \ k \]

最後判斷一下是都知足 \(0\) 便可,最後存一個數組裏一個一個加求和

  • 利用楊輝三角優化

咱們經過楊輝三角的方法來把全部的方案數都列出來能夠獲得這麼一個圖形

經過這個式子很簡單的能夠發現(行是 \(n\) 列爲 \(m\) )

\[C^{m}_{n}=\begin{cases} C^{m-1}_{n}+C^{m}_{n-1} -C^{m-1}_{n-1}\ \ \ \ (C^{m}_{n}\ mod \ k\ !=0) \\ \\ C^{m-1}_{n}+C^{m}_{n-1} -C^{m-1}_{n-1}+1\ \ \ \ (C^{m}_{n}\ mod \ k\ =0) \end{cases}\]

因而乎,你就能夠快樂的用 \(O(1)\) 作完這個題

代碼實現

P1313 [NOIP2011 提升組] 計算係數

思路

經過枚舉 $ k\le 5 ,a=1$的全部係數排列發現是一個楊輝三角

而且\(x^ny^m\)的係數所在的位置爲\((k+1,k-n+1)\)

最後的係數乘上\(a^nb^m\)便可

注意開$long\ long $

代碼實現

P6057 [加油武漢]七步洗手法

思路

首先由於是徹底圖的緣故,那麼由各個頂點組成的三角形一共有

\[\sum_{i=1}^{n-2} \frac{(n-i-1) \times (n-i)}{2} \]

其次看題目,要找同色三元環的數量,而且根據提示,所給的 \(m\) 條邊均沒有組成自環的,因此只多是黑色三元環

那麼首先求出白色邊會破壞的三角形數量,每個爲\((n-2)\)個三角形,那麼一共破壞的是

\[\sum_{i=1}^{m} \ (n-2) \]

可是其中咱們會發現的是,每當一個點所鏈接的白邊數\(poi_i\geq 2\)時,都會出現重疊的狀況,而且每次重疊了\(poi_i-1\)個,因此每個點一共重疊考慮的是

\[\sum_{i=1}^{poi_i-1}\ i \]

條邊

那麼轉化爲公式就是一共重疊考慮的邊爲

\[\sum_{i}^{n} \frac{(poi_i-1)\times(poi_i)}{2} \]

最後減去白色所影響的邊,加上重複考慮的邊,即爲答案

代碼實現

P1066 [NOIP2006 提升組] 2^k進制數(重點+高精)

思路

由於是高精,因此就直接重點講解一下=_=

先看一看題意

\(r\) 是個 \(2^k\) 進制數,並知足如下條件:

  • \(r\) 至少是個 \(2\) 位的 \(2^k\)進制數。

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

  • \(r\) 轉換爲二進制數 \(q\) 後,則 \(q\) 的總位數不超過 \(w\)

在這裏,正整數 \(k,w\) 是事先給定的。

問:知足上述條件的不一樣的 \(r\) 共有多少個?

首先把重點鎖定在最高位上便可

題目給出的定義是,把轉化後的二進制串一共分紅了 \(w/k\) 個整段,也許還有一個長度小於 \(k\) 的段

1、先來討論一下剛好分紅 \(w/k\) 段的狀況

這種狀況下,每一段能夠選擇的數爲\(0…2^k-1\)中的一個

而且能夠選擇 \(2-w/k\)個數來拼湊,能夠發現這是一個有序的,符合組合數的性質,就能夠獲得公式

\[ans= \sum_{i=2}^{w/k}\ C_{2^k-1}^{i} \]

2、當有一段 \(<\) \(k\) 的時候

這個狀況,能夠先看一看最高位一共佔了幾個二進制位

經過簡單分析能夠獲得,一共是\(len=w\)%\(k\)的長度

那麼能夠取到的數有 \(1…2^{len}-1\)

由於若是有前導 \(0\) 會致使和前面的重複,因此不予考慮

因此就在選了前\(w/k\)的數的基礎上再+1,構成最終滿的排列

由於在最高位選了數 \(i\),因此就只能在\(2^k-1-i\)中選擇

於是獲得公式

\[ans=\sum_{i=2}^{w/k}\ C_{2^k-1}^{i}+\sum_{i=1}^{2^{w\ mod\ k}-1}C_{2^{k}-1-i}^{w/k} \]

求解就能夠啦,注意高精便可

代碼實現

P1771 方程的解

思路

插空法+高精乘法,詳情請看上方,注意開$long \ long $

代碼實現

P1350 車的放置

思路

直接根據二維內的公式進行分離並求式子,分紅 \(a\times (b+d)\) 的和 \(c\times d\) 的兩個矩陣,推出式子

\[\sum_{i=0}^{k}C_{a}^{i}\times C_{b+d-(k-i)}^{i}\times i! \times C_{c}^{k-i} \times C_{d}^{k-i}\times (k-i)! \]

注意此時\(0!=1\)

爲何要有 \(b+d(k-i)\)

由於在第二個矩形中確定已經找完了\((k-i)\)行,不能再在第一個矩形裏面找了,因此要把這些狀況所有減去

代碼實現

10235. 「一本通 6.6 練習 6」序列統計

思路

$ Lucas$ 定理的實際應用

也就至關於把 \(n\) 個相同的球放到了\(R-L+1\)個盒子裏,球能夠不放完,盒子能夠爲空

那麼再加一個盒子,把沒有放的都放到那個盒子裏面

那麼這個題目就至關於在\(R-L+2\)個盒子中放上 \(n\) 個球的方案

也就是 \(n\) 個籃球,有\(R-L+1\) 個隔板,能夠挨着排列,求方案數

經典的隔板法

簡單理解爲插板法的第二種方法

獲得公式爲

\[ans=C_{n+R-L+1}^{R-L+1}-1 \]

模數較小用\(Lucas\)定理作便可

代碼實現

相關文章
相關標籤/搜索