二項式反演
前置技能:二項式定理
定理: \((a+b)^n=\sum_{k=0}^{n}C_{n}^{k} a^k b^{n-k}\) 。
證明:(數學歸納法)
-
\((a+b)^1=a+b=\sum_{k=0}^{1}C_{1}^{k}a^kb^{1-k}\) 。
-
假設, \((a+b)^m\) 滿足二次項定理,那麼
\[(a+b)^{m+1}=(a+b)\sum_{k=0}^{m}C_{m}^{k}a^kb^{m-k}\]
\[=\sum_{k=0}^{m}C_{m}^{k}a^{k+1}b^{m-k}+\sum_{k=0}^{m}C_{m}^{k}a^kb^{m-k+1}\]
\[=\sum_{k=1}^{m+1}C_{m}^{k-1}a^{k}b^{m-k+1}+\sum_{k=0}^{m}C_{m}^{k}a^kb^{m-k+1}\]
\[=\sum_{k=0}^{m+1}C_{m}^{k-1}a^{k}b^{m-k+1}+\sum_{k=0}^{m+1}C_{m}^{k}a^kb^{m-k+1}\]
\[=\sum_{k=0}^{m+1}C_{m+1}^ka^kb^{m+1-k}\]
證畢。
二項式反演
- 一般,二項式反演解決的是哪些問題呢?
- 直接求不好求,但是至少好求;
- 直接求不好求,但是至多好求;
- \(f[i]\) 表示至多有 \(i\) 個點的情況數, \(g[i]\) 表示恰好有 \(i\) 個點的方案數。
- \(f[n]=\sum_{i=0}^ng[i]*C_n^i\) ,那麼 \(g[n]=\sum_{i=0}^n(-1)^{n-i}C_n^if[i]\) 。
- 證明就是按照定義,將 \(f[i]\) 代入推一推。(證明略)
- 例題,今天比賽第一題的30分。
-
題目求把一個s<=S,分到m個盒子裡,前n個盒子裡的小球數量均不能超過t,並且所有盒子非空的方案數。
-
先二項式反演一下,設 \(f[i]\) 表示n個盒子裡至少有i個盒子超過t的方案數, \(g[i]\) 表示n個盒子裡恰好有i個盒子超過t的方案數。 \(g[0]=\sum_{i=0}^n(-1)^iC_n^iC_{s-it-1}^{n-1}\) 。
-
考慮後面的 \(m-n\) 個盒子分配方式和去掉it之後前n個盒子是一樣的。
-
所以總的答案為
\[\sum_{i=0}^n\sum_{k=0}^{s}C_{k-it-1}^{m-1}C_n^i(-1)^i\]
\[=\sum_{i=0}^nC_{s-it}^{m}C_n^i(-1)^i\] 。
- 下面的這個組合數合併到一起非常的妙,能這麼合併是因為你考慮C的組合意義。發現 \(\sum_{k=0}^sC_{k-it-1}{m-1}\) 其實就是將 \(s-it+1\) 分成m+1份的方案數。
- 如此,時間複雜度變為 \(O(m+s)\) 。30分get。
-
媽耶,集訓隊神題,後面的高分解法看都不敢看QAQ。