感謝 caq 的奇奇怪怪的組合數學筆記,實在看不下去了!html
文中如無特殊說明,只有在出現 \(A_{n}^{m}\) 的式子中,組合數才使用 \(C_{n}^{m}\),其他一概用 \(\dbinom{n}{m}\)。spa
暫無htm
計算式會在正文給出。blog
從 \(n\) 個數中選擇 \(m\) 個數,與排列順序有關的方案數被稱爲 \(n\) 排列 \(m\),記做 \(A_{n}^{m}\)。get
特別的,當 \(n = m\) 時,\(A_{n}^{m}\),被稱爲 \(n\) 或 \(m\) 的全排列。數學
從 \(n\) 個數中選擇 \(m\) 個數,只與選擇的數有關的方案數被稱爲 \(n\) 選 \(m\),記做 \(\dbinom{n}{m}\) 或 \(C_{n}^{m}\)。class
實際應用中,組合的應用範圍遠遠比排列要廣。排列常常只被使用全排列這一種形式來輔助組合的計算。date
組合:方法
排列:im
所以那麼顯然有:
全排列:
排列與組合的關係:
接下來咱們把目光重點放在組合上。
下面提供四種計算組合數的計算式。
待填。
第一個,預處理出階乘便可。
若是要求在取模意義下,分母部分能夠預處理階乘的逆元。
預處理時,只需計算出最大可能的 \(n\) 的階乘的逆元,而後倒推便可。
複雜度是 \(O(n)\) 的,通常用於計算 \(n, m \le 10^6\) 範圍內的組合數,是頗有用的組合數計算方式。
具體實現能夠參考個人 這篇題解。
同時,這個方法也能夠用來預處理一整個數列的乘法逆元。不難推導,讀者能夠自行思考一下。
第二個,是組合數的遞推式。
若是把組合數的 \(n,m\) 較小的答案算出來,不難發現就是個「楊輝三角」。
所以就能夠遞推了。
這個方法的時空複雜度都是 \(\mathcal O(n^2)\) 的,不如第一個優秀,這種方法能實現的,第一種方法都能代替。
第三個,是組合數的另外一種計算式。
這種方法把直接用組合數計算式 \(\dfrac{n!}{m!(n - m)!}\) 分子中的 \(n!\)、分母中的 \(m!\) 拆開來,成爲:
即
咱們知道,當 \(m = 0\) 時,不管 \(n\) 爲什麼值, \(\dbinom{n}{m}\) 恆爲 \(1\)。
所以,這種方法能夠一直迭代下去,直到表示到 \(m = 1\)。
經常使用於 \(n\) 巨大(通常在 \(10^9\) 級別),而 \(m\) 較小(通常在 \(10^5\) 級別)的時候組合數的計算。
實現時能夠預處理 \(1\) 到 \(m\) 的逆元。
第四種,待填。