「學習筆記」各類容斥反演總結


應該會更好的閱讀體驗

一點亂記,用於個人理解和鞏固,亦可作為一篇學習順序參考的文章。

如有筆誤敬請指出。

二項式反演

組合恆等式

\(\binom{n}{k}=\binom{n}{n-k},n\geq 0\),對稱恆等式。

\(k\binom{n}{k}=n\binom{n-1}{k-1},k\neq 0\),吸收恆等式。

\(\binom{n}{m}\binom{m}{k}=\binom{n}{k}\binom{n-k}{m-k}\),組合意義易證。

\(\sum_k \binom{r}{m+k}\binom{s}{n-k}=\binom{r+s}{n+m}\),范德蒙德卷積,組合意義易證。

求一列的前綴和:\(\sum\limits_{i=m}^n\binom{i}{m}=\binom{n+1}{m+1}\),放在楊輝三角上易解釋。

更多的可以去看具體數學(?)

栗題一 ARC016F Card Game for Three

小 A,小 B,小 C 在玩游戲。他們每個人分別有 \(n,m,k\) 張牌,每張牌上面寫着 \(a,b,c\) 三個字母中的其中一個,每個回合有一個人出牌,如果出牌為 \(a\) 則小 A 下一個回合出牌,如果出牌為 \(b\) 則小 B 下一個回合出牌,小 C 同理。若輪到某位玩家出牌時,其手中無牌,則該位玩家獲勝。

現在小 A 第一個出牌,對所有 \(3^{n+m+k}\) 種手牌擁有的可能性計算小 A 獲勝的方案數,對 \(10^9+7\) 取模。

如果按照打出的順序排成一個長度為 \(l\) 的序列,小 A 獲勝當且僅當:\(a\) 恰好出現了 \(n\) 次且在最后一次出現,\(b\) 出現了不多於 \(m\) 次,\(c\) 出現了不多於 \(k\) 次。

而這個長度為 \(l\) 的序列對應了 \(3^{n+m+k-l}\) 種手牌擁有的情況。

\(n\) 次是一定打的,枚舉 \(b,c\) 出現的次數 \(t\),然后枚舉 \(b\) 出現的次數 \(i\)

\[\sum_{t=0}^{m+k}\binom{n+t-1}{n-1}3^{m+k-t}\sum_{i=t-k}^{m}\binom{t}{i} \]

第一個組合數是除了最后一個是 \(a\),確定 \((n-1)\)\(a\) 的位置,\(3^{m+k-t}\) 是計算的對應了多少種手牌擁有情況,最后一個組合數為在 \(t\)\(b,c\) 都可以填的空位挑出 \(i\) 個填 \(b\),注意這個組合數可能會出現 \(i<0\)\(i>t\) 的情況,由於是考慮其實際的組合意義,所以當出現這樣的情況時視為 \(0\)

最后一個實際上是組合數一行的區間和,眾所周知這個的計算是困難的,由於這個區間和的形式比較特殊,考慮遞推出這個東西:

\[\begin{aligned} S(t)=&\sum_{i=t-k}^{m}\binom{t}{i} \\ =&\sum_{i=t-k}^{m}\binom{t-1}{i-1}+\sum_{i=t-k}^{m}\binom{t-1}{i} \\ =&\sum_{i=t-k-1}^{m-1}\binom{t-1}{i}+\sum_{i=t-k}^{m}\binom{t-1}{i} \\ =&\ 2\cdot\sum_{i=t-k-1}^{m}\binom{t-1}{i}-\binom{t-1}{m}-\binom{t-1}{t-k-1} \\ =&\ 2\cdot S(t-1)-\binom{t-1}{m}-\binom{t-1}{t-k-1} \end{aligned} \]

至此,可以在 \(\mathcal{O}(n+\log \bmod)\) 的時間復雜度內解決問題。

Code

二項式反演

形式一:

\[f(n)=\sum_{k=0}^n(-1)^k\binom{n}{k}g(k)\Longleftrightarrow g(n)=\sum_{k=0}^n(-1)^k\binom{n}{k}f(k) \]

形式二(至多和恰好的轉換):

\[\begin{aligned} f(n)=\sum_{k=0}^{n} \binom{n}{k}g(k)\Longleftrightarrow g(n)=\sum_{k=0}^{n}(-1)^{n-k}\binom{n}{k} f(k) \end{aligned} \]

形式三(至少和恰好的轉換):

\[f(n)=\sum_{k=n}^m\binom{k}{n}g(k)\Longleftrightarrow g(n)=\sum_{k=n}^m (-1)^{k-n}\binom{k}{n}f(k) \]

三種形式的證明類似,可以看 vfk 的PPT

要區分這里的“至多,至少”和前綴和/后綴和對應的“至多至少”,二項式反演的“至多,至少”實際上是欽點一部分滿足條件,其余部分隨意,而前綴和/后綴和的“至多,至少”是欽點一部分滿足條件之后,其他的必須不滿足,所以前者是帶一個二項式系數的。

栗題二 BZOJ 3622 已經沒有什么好害怕的了

先各自排下序,\(k\gets \frac{n+k}{2}\),其含義為要恰好\(k\) 對滿足 \(a>b\)

直接 dp 不太好做,因為如果狀態設置為"前 \(i\)\(a\) 匹配了 \(j\)\(a>b\)" 的話,我們要考慮 \(b\) 中小於 \(a_i\) 的個數 \(l_i\) 中有多少個數被之前選過了,然而只從 \(j\) 這一維無法體現這個信息。

所以就欽點 \(j\) 這一維表示 \(l_i\) 中有多少個 \(b\) 被之前的 \(a\) 選過了,只讓 \(a\) 和小於它的 \(b\) 匹配,最后剩下的就讓他們亂排,乘一個階乘。由於最后亂排還可能匹配出 \(a<b\) 的,所以意義變為了至少\(j\) 對匹配了 \(a>b\)

\(F(k)\) 為至少有 \(k\)\(a>b\)\(G(k)\) 為恰好有 \(k\)\(a>b\)

\(F\) 很容易 dp 出來,也就是:

\[F(k)=f_{n,k}(n-k)! \]

其中 \(f_{i,j}=f_{i-1,j}+f_{i-1,j-1}(l_i-j+1)\),分別表示 \(a_i\) 進行匹配而是鴿到最后再匹配 和 \(a_i\) 找一個比它小的 \(b\) 匹配。

考慮到:

\[F(k)=\sum_{i=k}^n\binom{i}{k}G(i) \]

很好理解,就是考慮這個“至少”的方案實際上有多少對 \(a>b\)

二項式反演得:

\[G(k)=\sum_{i=k}^n(-1)^{i-k}\binom{i}{k}F(i) \]

問題解決。

莫比烏斯反演

歐拉函數

  • \(\varphi(p^k)=(p-1)p^{k-1}\)
  • \(\varphi(n)=n\prod (1-\frac{1}{p})\),既可以從容斥原理角度考慮,也可以考慮直接利用 \(\varphi\) 為積性函數拆開對於每個素因子單獨計算。

常用狄利克雷卷積

  • \(1*\mu=\epsilon \Rightarrow\sum\limits_{d|n}\mu(d)=[n==1]\),考慮 \(\mu(d)\neq 0\)\(d\),按照素因子個數分類在一起,再枚舉素因子個數然后二項式定理;
  • \(id=\varphi*1\Rightarrow id*\mu=\varphi\),考慮對 \(\leq n\) 且與 \(n\)\(\gcd\)\(d\) 的正整數個數為 \(\varphi(\frac{n}{d})\)

狄利克雷前綴和/差分/后綴和/差分

感性理解一下,實際上問題就是關於質因數分解后指數的高維前綴和。

前綴和實際上是卷了一個 \(1\),這個很好理解,因為式子一模一樣。

前綴差分實際上是卷了一個 \(\mu\),因為 \(b=a*\mu \Longleftrightarrow a=b*1\),而已知 \(a\)\(b\) 實際上就是狄利克雷前綴差分。

狄利克雷前綴和

for(int i = 1; i <= pct; ++i)
	for(int j = 1; j*p[i] <= n; ++j)
		a[j*p[i]] += a[j];

狄利克雷前綴差分

for(int i = 1; i <= pct; ++i)
	for(int j = n/p[i]; j; --j)
		a[j*p[i]] -= a[j];

狄利克雷后綴和

for(int i = 1; i <= pct; ++i)
	for(int j = n/p[i]; j; --j)
		a[j] += a[j*p[i]];

狄利克雷后綴差分

for(re int i = 1; i <= pct; ++i)
	for(re int j = 1; j <= n/p[i]; ++j)
		a[j] -= a[j*p[i]];

更一般的,如果對於任意的積性函數,也有類似的方法。

設數論函數為 \(F\),積性函數為 \(G\),欲求 \(F*G\)

先把 \(F\) 拆分成若干之和質數 \(p\) 有關的積性函數 \(F_p\) 的卷積,即:

\[F_p(n)\left\{\begin{matrix} F(n)&n=p^k \\ 0&\mathrm{otherwise} \end{matrix}\right. \]

顯然有 \(F=\prod F_p\)

把這些 \(F_p\) 分別卷到 \(G\) 上去即可求得答案。

\[(G*F_p)(n)=\sum_{p^k|n}G(\frac{n}{p^k})F_p(p^k) \]

對於每個 \(p^k\) 枚舉其倍數然后計算,預先存下需要用到的 \(G\) 即可。

這樣復雜度為 \(\mathcal{O}(\sum n/p^k)\),等比數列求和可得 \(\mathcal{O}(\sum n/p^k)=\mathcal{O}(n\sum \frac{1}{p-1})=\mathcal{O}(n\log \log n)\)

栗子 \(\gcd\) 卷積

\(c_n=\sum\limits_{(i,j)=n}a_ib_j\)

莫比烏斯反演易做到 \(\mathcal{O}(n\log n)\)(?)這里可以用狄利克雷前綴和做到 \(\mathcal{O}(n\log \log n)\)

先求 \(c\) 的高維后綴和 \({c'}_{n}=\sum\limits_{n|(i,j)}a_ib_j\) 再狄利克雷后綴差分即可求得答案。

\[\begin{aligned} {c'}_n&=\sum_{n|(i,j)}a_ib_j \\ &=\sum_{n|i,n|j}a_ib_j \\ &=\sum_{n|i}a_i\sum_{n|j}b_j \\ &={a'}_n{b'}_n \end{aligned} \]

所以,將 \(a,b\) 作高維后綴和(狄利克雷后綴和),點乘后作高維后綴差分即可得到 \(c\)

莫比烏斯反演

\(g(n)\) 為數論函數。

如果 \(f\)\(g\) 的狄利克雷前綴和即:

\[f(n)=\sum_{d|n}g(d)\tag{1} \]

則有:

\[g(n)=\sum_{d|n}\mu(\frac{n}{d})f(d)\tag{2} \]

\[g=f*\mu \]

證明: \(f=g*1 \Rightarrow f*\mu=(g*1)*\mu=g*(1*\mu)=g*\epsilon=g\)

另一種形式:

如果有:

\[f(n)=\sum_{n|d}g(d) \]

則有:

\[g(n)=\sum_{n|d}\mu(\frac{d}{n})f(d) \]

這里的 \(d\) 通常是小於等於一個界限,也就是題目中所給定的 "\(n\)"。

特別地,當 \(n=1\) 時,\(g(1)=\sum \mu(d)f(d)\),也可以理解為容斥系數為 \(\mu\) 的容斥。

證明可以看 oi-wiki(

\(F(n)=\exp(f(n)),G(n)=\exp(g(n))\)\((1)\)\(\exp\),得到:

\[F(n)=\prod_{d|n}G(d) \]

\((2)\)\(\exp\),得到:

\[G(n)=\prod_{d|n}F(d)^{\mu(\frac{n}{d})} \]

也就是:

\[f(n)=\prod_{d|n}g(d)\Longleftrightarrow g(n)=\prod_{d|n}f(d)^{\mu(\frac{n}{d})} \]

知道應該怎么推,避免遇到有 \(\prod\) 的數論題直接抓瞎(

栗題一

求長度為 \(n\) 且僅包含小寫英文字母且循環節長度恰為 \(n\) 的字符串的個數。

\(n\leq 10^9\)

\(f(n)\) 為長度為 \(n\) 的字符串個數,\(g(n)\) 為長度為 \(n\) 且最小循環節長度為 \(n\) 的字符串個數。

\(f(n)\) 是易求的,其為 \(26^n\).我們可以枚舉最小循環節,用 \(g\) 來算出 \(f\)

\[f(n)=\sum_{d|n}g(d) \]

莫比烏斯反演得:

\[g(n)=\sum_{d|n}\mu(\frac{n}{d})f(d) \]

輕易解決。

栗題二 Codeforces 1559E Mocha and Stars

對第三個條件進行莫比烏斯反演,得:

\[ans=\sum_{d=1}^m \mu(d)f(d) \]

其中 \(f(d)\)\(\gcd\)\(d\) 的倍數時的答案。

對於 \(f(d)\),每次可以做一下背包,用前綴和優化易做到 \(\mathcal{O}(\frac{nm}{d})\),總時間復雜度就是 \(\mathcal{O}(nm\log nm)\),注意到 \(\mu(d)\)\(0\) 的時候不用跑背包,所以這個遠遠跑不滿。

Code

斯特林反演

第一類斯特林數

\(s(n,k)\) 為把 \(n\) 個數分成 \(k\) 個無區分輪換的方案數,也可以表示為 \(\begin{bmatrix}n\\k\end{bmatrix}\)

特別地:

  • \(\begin{bmatrix}n\\0\end{bmatrix}=0,n>0\)
  • \(\begin{bmatrix}0\\0\end{bmatrix}=1\):我們假裝只有一種方法可以把一個空集欽點成零個非空輪換。

第一類斯特林數有遞推式:

\[\begin{bmatrix}n\\k\end{bmatrix}=\begin{bmatrix}n-1\\k-1\end{bmatrix}+(n-1)\begin{bmatrix}n-1\\k\end{bmatrix} \]

考慮組合意義,\(n\) 是單獨一個輪換還是和前面分在一起。

\[\begin{bmatrix}n\\k\end{bmatrix}=\sum_{i=1}^n \binom{n-1}{i-1}(i-1)!\begin{bmatrix}n-i\\k-1\end{bmatrix} \]

考慮組合意義,\(1\) 所在的輪換的大小是 \(i\)

第一類斯特林數 · 行

\(G_n(x)=\sum_i \begin{bmatrix}n\\i\end{bmatrix}x^i\),則根據遞推式有 \(G_n=xG_{n-1}+(n-1)G_{n-1}=(x+n-1)G+{n-1}\),展開之后得到:

\[G_n(x)=\prod_{i=0}^{n-1}(x+i)=x^{\overline n} \]

顯然可以分治 + FFT 在 \(\mathcal{O}(n\log^2 n)\) 來求得 \(G_n\),也可以倍增 + FFT:

假設現在已經求出了 \(G_n(x)=\sum a_ix^i\),想要求得 \(G_{2n}(x)\)

\[\begin{aligned} G_{2n}(x)=G_n(x)\times G_n(x+n) \\ G_n(x+n)&=\sum_i a_i(x+n)^i \\ &=\sum_i a_i\sum_{j} \binom{i}{j}x^jn^{i-j} \\ &=\sum_i{x^i}\frac{1}{i!}\sum_{j} a_jj!\frac{n^{j-i}}{(j-i)!} \end{aligned} \]

這樣兩次卷積就能求出 \(G_{2n}(x)\),復雜度為 \(T(n)=T(n/2)+\mathcal{O}(n\log n)=\mathcal{O}(n\log n)\)

多項式技巧不精,第一類斯特林數 · 列待填坑。

第二類斯特林數

\(S(n,k)\) 為把 \(n\) 個數分成 \(k\) 個無區分集合的方案數,也可以表示為 \(\begin{Bmatrix}n\\k\end{Bmatrix}\)

特別地:

  • \(\begin{Bmatrix}n\\0\end{Bmatrix}=0,n>0\)
  • \(\begin{Bmatrix}0\\0\end{Bmatrix}=1\):我們假裝只有一種方法可以把一個空集欽點成零個非空部分。

第二類斯特林數有遞推式:

\[\begin{Bmatrix}n\\k\end{Bmatrix}=\begin{Bmatrix}n-1\\k-1\end{Bmatrix}+k\begin{Bmatrix}n-1\\k\end{Bmatrix} \]

考慮組合意義即可,\(n\) 是單獨一個集合還是分在前面的集合中。

\[\begin{Bmatrix}n\\k\end{Bmatrix}=\sum_{i=1}^n \begin{Bmatrix}n-i\\k-1\end{Bmatrix}\binom{n-1}{i-1} \]

考慮組合意義即可,\(i\) 為枚舉的 \(1\) 所在的集合大小是多少。

第二類斯特林數通項 / 第二類斯特林數 · 行

有一個恆等式:

\[m^n=\sum_{i=0}^{m}m^{\underline i}\begin{Bmatrix}n\\i\end{Bmatrix}=\sum_{i=0}^m\binom{m}{i}\begin{Bmatrix}n\\i\end{Bmatrix}i! \]

考慮組合意義即可,左邊是 \(n\) 個球放入 \(m\) 個可空盒子的方案數,右邊是枚舉非空的集合數,亦可以用數學歸納法證明。

二項式反演得:

\[\begin{Bmatrix}n\\m\end{Bmatrix}m!=\sum_{i=0}^m(-1)^{m-i}\binom{m}{i}i^n \]

進一步轉化可得:

\[\begin{Bmatrix}n\\m\end{Bmatrix}=\sum_{i=0}^{m} \frac{(-1)^{i}}{i !} \cdot \frac{(m-i)^{n}}{(m-i) !} \]

這樣就化成了一個卷積的形式,可以 \(\mathcal{O}(n\log n)\) 求得所有的 \(\begin{Bmatrix}n\\i\end{Bmatrix}\)

多項式技巧不精,第二類斯特林數 · 列待填坑。

上降冪與普通冪

在 "一行第一類斯特林數求和" 中提到過上升冪轉普通冪

\[x^{\overline n}=\sum_{k=0}^n \begin{bmatrix}n\\k\end{bmatrix}x^k\tag{1} \]

另有普通冪轉上升冪

\[x^n=\sum_{k=0}^n\begin{Bmatrix}n\\k\end{Bmatrix}(-1)^{n-k}x^{\overline{k}}\tag{2} \]

數學歸納法易證。

下降冪與普通冪

在 "第二類斯特林數通項 / 一行第二類斯特林數求和" 中提到過普通冪轉下降冪

\[x^n=\sum_{k=0}^{n}\begin{Bmatrix}n\\k\end{Bmatrix}x^{\underline k}\tag{3} \]

另有下降冪轉上升冪

\[x^{\underline n}=\sum_{k=0}^n\begin{bmatrix}n\\k\end{bmatrix}(-1)^{n-k}x^k\tag{4} \]

數學歸納法易證。

不用數學歸納法?顯然有 \(x^{\underline n}=(-1)^n (-x)^{\overline n}\)(直接拆開易證),代入到 \((3)\)\((2)\),代入到 \((2)\)\((4)\)

反轉公式

\((4)\) 代入到 \((3)\) 得:

\[\begin{aligned} x^n&=\sum_{i=0}^{n}\begin{Bmatrix}n\\k\end{Bmatrix}\sum_{m=0}^k\begin{bmatrix}k\\m\end{bmatrix}(-1)^{k-m}x^m \\ &=\sum_{m=0}^nx^m\sum_{k=m}^n\begin{Bmatrix}n\\k\end{Bmatrix}\begin{bmatrix}k\\m\end{bmatrix}(-1)^{k-m} \end{aligned} \]

對比系數可得:

\[\sum_{k=m}^n\begin{Bmatrix}n\\k\end{Bmatrix}\begin{bmatrix}k\\m\end{bmatrix}(-1)^{k-m}=[m=n]\tag{5} \]

同理,把 \((1)\) 代入 \((2)\) 可得:

\[\\ \sum_{k=m}^n\begin{Bmatrix}n\\k\end{Bmatrix}\begin{bmatrix}k\\m\end{bmatrix}(-1)^{n-k}=[m=n]\tag{6} \]

\((2)\) 代入 \((1)\) 得:

\[\sum_{k=m}^n\begin{bmatrix}n\\k\end{bmatrix}\begin{Bmatrix}k\\m\end{Bmatrix}(-1)^{k-m}=[m=n]\tag{7} \]

\((3)\) 代入 \((4)\) 得:

\[\sum_{k=m}^n\begin{bmatrix}n\\k\end{bmatrix}\begin{Bmatrix}k\\m\end{Bmatrix}(-1)^{n-k}=[m=n]\tag{8} \]

有的地方將 \((5),(7)\) 稱為反轉公式,有的地方將 \((6),(8)\) 稱為反轉公式,在此並不繼續深究。

斯特林反演

\[f(n)=\sum_{k=0}^n\begin{Bmatrix}n\\k\end{Bmatrix}g(k)\Longleftrightarrow g(n)=\sum_{k=0}^n(-1)^{n-k}\begin{bmatrix}n\\k\end{bmatrix}f(k)\tag{9} \]

\[f(n)=\sum_{k=0}^n\begin{bmatrix}n\\k\end{bmatrix}g(k)\Longleftrightarrow g(n)=\sum_{k=0}^n(-1)^{n-k}\begin{Bmatrix}n\\k\end{Bmatrix}f(k)\tag{10} \]

證明一下 \((9)\)

\[\begin{aligned} g(n)&=\sum_{i=0}^n[n=i]g(i) \\ &=\sum_{i=0}^n\sum_{k=i}^n\begin{bmatrix}n\\k\end{bmatrix}\begin{Bmatrix}k\\i\end{Bmatrix}(-1)^{n-k}g(i) \\ &=\sum_{k=0}^n(-1)^{n-k}\begin{bmatrix}n\\k\end{bmatrix}\sum_{i=0}^k\begin{Bmatrix}k\\i\end{Bmatrix}g(i) \\ &=\sum_{k=0}^n(-1)^{n-k}\begin{bmatrix}n\\k\end{bmatrix}f(k) \end{aligned} \]

\((10)\) 的證明類似,證明思路大概是:找到一個 “\(if\)”,說一句廢話,把式子代入,交換求和號,整理一下。

通過前面二項式反演的證明以及后面提到的反演的證明更加體現了這個思路。

前面證莫比烏斯反演也是可以這么證的,不過用狄利克雷卷積更簡單我就用狄利克雷卷積證了。

栗題一 HDU 4372 Count the Buildings

\(n\) 前面有 \(F-1\) 個前綴最大,\(n\) 后面有 \(B-1\) 個后綴最大,那么把每一個前/后綴最大及其前/后面一段沒有碰到前/后綴最大的看成一段,發現是欽定這一段讓最大值排最前面,所以這些方案數是 \(\begin{bmatrix}n-1\\F+B-2\end{bmatrix}\),然后選出 \(F-1\) 個放在 \(n\) 前面,答案為 \(\binom{F+B-2}{F-1}\begin{bmatrix}n-1\\F+B-2\end{bmatrix}\)

栗題二 HDU 7095 / 2021 年百度之星·程序設計大賽 - 復賽 B Add or Multiply 1

你有一個數字 \(x\) 和若干個操作,每個操作是 \(+a_i\) 或者乘 \(\times a_i\) 中的一種。你可以重新排列這些操作的順序,然后對數字 \(x\) 執行這些操作。

比如說三個操作是 \(+a_1,+a_2,\times a_3\)。如果按順序執行這三個操作,那么得到的結果是 \(((x+a_1)+a_2)\times a3\)。如果排列成 \(+a_2,\times a_3,+a_1\),那么得到的結果是 \(((x+a_2)\times a_3)+a_1\)

我們會發現,有一些操作順序計算出來的結果是本質相同的,比如說 \(+a_1,+a_2,\times a_3\) 和 $+a_2,+a_1,\times a_3 $這樣運算下來結果是一樣的。我們認為兩個操作順序計算的結果本質相同,當且僅當無論代入什么數,計算出來的結果都是一樣的。

請問有多少種本質不同的操作序列。換句話說就是最多能找到多少個操作序列,使得這些操作序列任意兩個都不是本質相同的。由於答案很大,輸出對 \(10^9+7\) 取模的結果。

在這個題目中,我們只會給出加法操作和乘法操作的個數,分別是 \(n,m\),並不會給出具體的順序和數字。容易發現,答案與具體的順序和數字無關。

\(T\) 組詢問,\(1\leq T\leq 10^4,1\leq n,m\leq 3000\)

\(x\) 個有標號球放進 \(y\) 個有區分非空盒子方案數 \(=\ y!\times\)\(x\) 個有標號球放進 \(y\) 個無區分非空盒子方案數 \(=\ \begin{Bmatrix}x\\y\end{Bmatrix}y!\),設其為 \(calc(x,y)\)

其中 \(\begin{Bmatrix}x\\y\end{Bmatrix}\) 為第二類斯特林數。

考慮枚舉有 \(i\) 個連起來的乘法塊,那么其方案數為 \(calc(m,i)\)

\(i\) 個乘法塊形成了 \((i+1)\) 個空隙,兩邊的 \(2\) 個可空,中間的 \((m-1)\) 個非空。

\(n\) 個加法有三種方法:

  1. 只放中間 \((m-1)\) 個(欽點兩個可空的都不放):\(calc(n,i-1)\)

  2. 欽點一個可空的為非空的,另一個不放:\(calc(n,i)\times 2\)

  3. 欽點兩個可空的為非空的:\(calc(n,i+1)\)

故答案為

\[\sum_{i=1}^mcalc(m,i)\times(calc(n,i-1)+calc(n,i-1)\times 2+calc(n,i+1)) \]

時間復雜度為 \(\mathcal{O}(m^2+Tm)\)

Code

栗題三 「TJOI / HEOI2016」求和

求:

\[f(n)=\sum_{i=0}^n\sum_{j=0}^i\begin{Bmatrix}i\\j\end{Bmatrix}2^jj!\bmod998244353 \]

\(1\leq n\leq 10^5\)

第二類斯特林數看起來就不好處理,考慮用第二類斯特林數通項公式把 \(\begin{Bmatrix}i\\j\end{Bmatrix}j!\) 換掉:

\[\begin{aligned} &=\sum_{i=0}^n\sum_{j=0}^i\begin{Bmatrix}i\\j\end{Bmatrix}2^jj! \\ &=\sum_{i=0}^n\sum_{j=0}^i2^j\sum_{k=0}^j(-1)^{j-k}\binom{j}{k}k^i \\ &=\sum_{j=0}^n\sum_{k=0}^j2^j(-1)^{j-k}\binom{j}{k}\sum_{i=j}^nk^i \\ &=\sum_{j=0}^n\sum_{k=0}^j2^j(-1)^{j-k}\frac{j!}{k!(j-k)!}\cdot\frac{k^{n+1}-1}{k-1} \end{aligned} \]

注意最后一步等比數列求和當 \(k=0,1\) 的時候需要特判掉。

把僅關於 \(j\) 的提出來,僅關於 \(k\) 的合並,僅關於 \((j-k)\) 的合並,整理成卷積的形式:

\[\begin{aligned} &=\sum_{j=0}^n2^jj!\sum_{k=0}^j\frac{(-1)^{j-k}}{(j-k)!}\cdot\frac{k^{n+1}-1}{k!(k-1)} \end{aligned} \]

快樂 FFT,復雜度 \(\mathcal{O}(n\log n)\)

栗題四 TopCoder 13444 CountTables

\(g(m)\)\(n\)\(m\) 列的矩陣,滿足任意兩行不相同的方案數,則有 \(g(m)=c^m(c^m-1)(c^m-2)...=(c^m)^{\underline n}\)

\(f(m)\)\(n\)\(m\) 列的矩陣,滿足任意兩行兩列都不相同的方案數,則有:

\[g(m)=\sum_{i=0}^m\begin{Bmatrix}m\\i\end{Bmatrix}f(i) \]

也就是划分成 \(i\) 個集合,每個集合里面都用一樣的列。

斯特林反演一下得到:

\[f(m)=\sum_{i=0}^m(-1)^{m-i}\begin{bmatrix}m\\i\end{bmatrix}g(i) \]

栗題五 Crash 的文明世界

給定 \(n\) 個點邊權均為 \(1\) 的樹和非負整數 \(m\),對於每個點 \(i\) 求出:

\[\sum_{j=0}^n\text{dist}(i,j)^m \]

\(10^4+7\) 取模。

\(n\leq 5\times 10^4,m\leq 150\)

暴力 點分治+FFT 可以做到 \(\mathcal{O}(n\log^2n)\)

考慮普通冪轉下降冪:

\[\begin{aligned} &\sum_{j=0}^n\text{dist}(i,j)^m \\ =&\sum_{j=0}^n\sum_{k=0}^{\text{dist}(i,j)}\binom{\text{dist}(i,j)}{k}\begin{Bmatrix}m\\k\end{Bmatrix}k! \\ =&\sum_{j=0}^n\sum_{k=0}^{m}\binom{\text{dist}(i,j)}{k}\begin{Bmatrix}m\\k\end{Bmatrix}k! \\ =&\sum_{k=0}^{m}\begin{Bmatrix}m\\k\end{Bmatrix}k!\sum_{j=0}^n\binom{\text{dist}(i,j)}{k} \end{aligned} \]

\(\sum\limits_{j=0}^n\binom{\text{dist}(i,j)}{k}=f_{i,k}\),如果能對於每個 \(i\) 求得 \(f_{i,k}\) 即可求得答案。

考慮固定 \(i\) 為根,此時的 \(j\) 的取值僅能為子樹內點的編號。

\[\begin{aligned} f_{x,k}&=\sum_{v\in son(x)}\sum_{w\in subtree(v)}\binom{\text{dist}(v,w)+1}{k} \\ &=\sum_{v\in son(x)}\sum_{w\in subtree(v)}\binom{\text{dist}(v,w)}{k-1}+\sum_{v\in son(x)}^n\sum_{w\in subtree(v)}\binom{\text{dist}(v,w)}{k} \\ &=\sum_{v\in son(x)}f_{v,k-1}+f_{v,k} \end{aligned} \]

此時只有根的答案是正確的,再換根 dp 即可。

時間復雜度 \(\mathcal{O}(nm)\)

Code

子集反演

\[f(S)=\sum_{T\subseteq S}g(T)\Longleftrightarrow g(S)=\sum_{T\subseteq S}(-1)^{|S|-|T|}f(T) \]

眾所周知,子集和超集本質上是相同的,只需要把每個集合看成自己的補集即可,同樣有:

\[f(S)=\sum_{S\subseteq T}g(T)\Longleftrightarrow g(S)=\sum_{S\subseteq T}(-1)^{|T|-|S|}f(T) \]

證明的基本思路和前面類似:

首先有:(枚舉 \(|T|\) 之后就是 \((1-1)^{|S|}\)

\[\sum_{T\subseteq S}(-1)^{|T|}=|S=\varnothing| \]

\[\begin{aligned} g(S)&=\sum_{T\subseteq S}[S-T=\varnothing]g(T) \\ &=\sum_{T\subseteq S}\sum_{A\subseteq S-T}(-1)^{|A|}g(T) \\ &=\sum_{A\subseteq S}(-1)^{|A|}\sum_{T\subseteq S-A}g(T) \\ &=\sum_{A\subseteq S}(-1)^{|S|-|A|}\sum_{T\subseteq A}g(T) \\ &=\sum_{A\subseteq S}(-1)^{|S|-|A|}f(A) \end{aligned} \]

得證。

如果擴展到多重集合,如何構造容斥系數 \(\mu\) 使得 \(\sum\limits_{T\subseteq S}\mu(T)=[S=\varnothing]\)

只需要讓重復的元素都不起作用,對貢獻為 \(0\) 即可,也就是 \(\mu(S)=(-1)^{|S|}[S中無重復元素]\)

於是:

\[f(S)=\sum_{T\subseteq S}g(T)\Longleftrightarrow g(S)=\sum_{T\subseteq S}\mu(S-T)f(T) \]

注意到前文提到的 "莫比烏斯反演" 實際上就是把每個質因子看成一個元素,把每一個數看成一個集合,做這個多重集合的反演,本質上是相同的。

vfk的PPT 中提到了可以拿來算 and,or 卷積,仔細理一下會發現實際上就是 FMT / 高維前綴/后綴和。

FMT

試試從子集反演的角度理解 FMT。

給定長度為 \(2^n\) 的數列 \(a,b\),計算 \(c\) 滿足:

\[c_n=\sum_{i|j=n}a_ib_j \]

\(n\leq 20\)

也可以稱之為 \(or\) 卷積?

把下標看成集合:

\[c_n=\sum_{u\cup v=n}a_ub_v \]

直接計算似乎很難,考慮計算出 \(c'_n=\sum\limits_{u\subseteq n}c_u\),然后把 \(c'\) 還原成 \(c\)

\[\begin{aligned} c'_n&=\sum_{u\cup v\subseteq n}a_ub_v \\ &=\sum_{u\subseteq n}\sum_{v\subseteq v}a_ub_v \\ &=\sum_{u\subseteq n}a_u\sum_{v\subseteq n}b_v \\ &=a'_ub'_v \end{aligned} \]

已知 \(a,b\)\(a',b'\),可以用高維前綴和完成。

\(a\)\(a'\) 的映射就是 FMT 啦(

已知 \(c'\)\(c\),就是高維前綴差分了,這個映射就是 IFMT。但其實也可以利用子集反演證明:

\[c'_n=\sum_{u\subseteq n}c_u\Longleftrightarrow c_n=\sum_{u\subseteq n}(-1)^{|n|-|u|}c'_u \]

計算 \(and\) 卷積也同理,把子集換成超集再來一遍就可以了。

FWT

既然都說到了 FMT,自然要提提 FWT?雖然這個東西和子集反演沒有什么關系(

回顧 FMT 的過程,實際上我們是構造了一個可逆的變換 \(F\) 滿足 \(F(c)=F(a)\cdot F(b)\)\(or\) 卷積是高維前綴和/差分,\(and\) 卷積是高維后綴和/差分。

給定長度為 \(2^n\) 的數列 \(a,b\),計算 \(c\) 滿足:

\[c_n=\sum_{i\oplus j=n}a_ib_j \]

\(n\leq 20\)

感覺還是背柿子比較好,以后有了新的理解大概會回來更新(

\(A_0\)\(A\) 的偶數下標處組成的序列,\(A_1\) 為奇數下標處,\((A,B)\) 指的是將序列 \(A\)\(B\) 拼接。

\[FWT(A)=(FWT(A_0)+FWT(A_1),FWT(A_0)-FWT(A_1)) \]

這個式子和 FFT 的很像。

\[IFWT(A)=(\frac{IFWT(A_0)+IFWT(A_1)}{2},\frac{IFWT(A_0)-IFWT(A_1)}{2}) \]

通過 \(FWT\) 的式子易推得這個式子。

單位根反演

論文哥:感覺就像是把dft推式子證法中這東西摳了出來起了個名字。沒在oi外的地方聽說這東西還有類似這樣的名字,像是近幾年的oi造的名詞。

\(n\) 次單位根為 \(\omega_n\)

顯然有:

\[\frac{1}{n}\sum_{k=0}^{n-1}\omega_n^{vk}=[v\bmod n = 0] \]

等比數列求和,由於 \(v\bmod n=0\) 的時候公比為 \(1\) 要特判。

栗題 LOJ6485 LJJ 學二項式定理

\[\begin{aligned} ans&=\sum\binom{n}{i}s^i\sum_{j=0}^3\frac{1}{4}\sum_{k=0}^3\omega_{4}^{(i-j)k} \\ &=\frac{1}{4}\sum_{j=0}^3a_j\sum_{k=0}^3\sum\binom{n}{i}s^i\omega_{4}^{(i-j)k} \\ &=\frac{1}{4}\sum_{j=0}^3a_j\sum_{k=0}^3\omega_4^{-jk}\sum\binom{n}{i}s^i\omega_{4}^{ik} \\ &=\frac{1}{4}\sum_{j=0}^3a_j\sum_{k=0}^3\omega_4^{-jk}(s\omega_{4}^{k}+1)^n \end{aligned} \]

min-max 容斥

\[\max(S)=\sum_{\varnothing\neq T\subseteq S}(-1)^{|T|-1}\min(T) \\ \min(S)=\sum_{\varnothing\neq T\subseteq S}(-1)^{|T|-1}\max(T) \]

眾做周知 \(\max\)\(\min\) 是一樣的,把優先級反過來即可。

現在證明上面那個式子,大體思路為:設出容斥系數,考慮每個元素是否能貢獻列出式子,然后二項式反演得到容斥系數。

設容斥系數為 \(f\),也就是 \(\max(S)=\sum_{\varnothing\neq T\subseteq S}f(|T|)\min(T)\),欽點一個元素的編號為它的從小到大的排名,則排名為 \(k\) 的元素的是否能貢獻為:

\[\sum_{i=0}^{n-k}\binom{n-k}{i}f(i+1)=[n-k=0] \]

\(F(n)=f(n+1),G(n)=[n==0]\),則有:

\[\sum_{i=0}^n\binom{n}{i}F(i)=G(n) \]

二項式反演:

\[\begin{aligned} F(n)&=\sum_{i=0}^n(-1)^{n-i}\binom{n}{i}G(i) \\ f(n+1)&=\sum_{i=0}^n(-1)^{n-i}\binom ni [i==0]=(-1)^n \end{aligned} \]

\(f(n)=(-1)^{n-1}\)

證畢。

如果左邊的 \(\max\) 是第 \(k\) 大,推導也同理,可得:

\[k\text{-}th\max(S)=\sum_{\varnothing T\subseteq S}(-1)^{|T|-k}\binom{|T|-1}{k-1}\min(T) \]

值得注意的是如果將 \(\max/\min\) 換成期望即 \(E(\max)/E(\min)\) ,也就是期望意義下的 \(\min\text{-}\max\) 容斥也是對的,形式化來講:

設全集 \(U=\{X_1,X_2,...,X_n\}\),其中 \(X_i\) 為互相獨立的隨機變量並且存在 \(E(X_i)\),則有:

\[E(\max(S))=\sum_{\varnothing\neq T\subseteq S}(-1)^{|T|-1}E(\min(T)) \]

\(\max\)\(\min\) 互換,以及第 \(k\) 大的 \(\min\text{-}\max\) 容斥在期望意義下也成立。

證明很簡單:

\[\max(S)=\sum_{\varnothing\neq T\subseteq S}(-1)^{|T|-1}\min(T) \\ E(\max(S))=E\left(\sum_{\varnothing\neq T\subseteq S}(-1)^{|T|-1}\min(T)\right) \]

由期望的線性性可得:

\[E(\max(S))=\sum_{\varnothing\neq T\subseteq S}(-1)^{|T|-1}E(\min(T)) \]

一個小栗子

我們知道,若干個數的 \(\gcd\) 相當於單獨考慮每個質因子,在各個數里面的指數拿出來組成一個可重集然后取 \(\min\),最后再把每個質因子以及對應的次冪乘起來。\(\text{lcm}\) 也是同理,於是我們可以對這個指數組成的可重集進行 \(\min\text{-}\max\) 容斥來做到 \(\gcd\)\(\text{lcm}\) 的轉換。

更具體地假如說有 \(\gcd(S),\text{lcm}(S)\) 分別代表集合 \(S\) 中所有數的 \(\gcd,\text{lcm}\),則有:

\[\text{lcm}(S)=\prod_{\varnothing\neq T\subseteq S}\gcd(T)^{(-1)^{|T|-1}} \]

\(\gcd\) 轉成 \(\text{lcm}\) 來也是同理。

栗題一 HAOI2015 按位或

二進制為 \(1\) 的數位看成一個元素,每個數看成一個集合。

定義每個元素的權值為第一次變成 \(1\) 的時間,那么可以定義每個集合的 \(\max,\min\)

所求即為 \(\max(U)\),其中 \(U\) 為全集,現在要對任意一個集合 \(S\) 計算 \(\min(S)\)

考慮枚舉時間,計算其對期望的貢獻。

定義一個集合 \(S\) 包含的元素的出現概率和(或者說與 \(S\) 有交的集合的概率和)為 \(p_{S}\)\(i\) 時刻第一次取到 \(S\) 中的元素,前 \((i-1)\) 個時刻一定都沒有取到 \(S\) 中的元素,則有:

\[\begin{aligned} \min(S)&=\sum_{i=1}^{+\infty}iP(\min(S)=i) \\ &=\sum_{i=1}^{+\infty}i(1-p_S)^{i-1}p_S \\x\gets 1-p_S \\ &=\sum_{i=1}^{+\infty}ix^{i-1}(1-x) \\ &=\sum_{i=1}^{+\infty}ix^{i-1}-ix^i \\ &=x^0+\sum_{i=1}^{+\infty}(i+1)x^{i}-ix^i \\ &=\sum_{i=0}^{+\infty}x^i \\ &=\frac{1}{1-x}=\frac{1}{p_S} \end{aligned} \]

其實就是每一步成功概率為 \(p\),則期望成功步數為 \(\frac{1}{p}\)

\(p_S\) 怎么求?注意到 \(x=1-p_S\) 為所有與 \(S\) 無交的集合概率和,也就是其補集的子集和,高維前綴和計算即可。

Reference

炫酷反演魔術 vfleaking的博客

斯特林數入門 Hongzy

具體數學 6.1 斯特林數

狄利克雷相關 command_block 的博客

斯特林數學習筆記 Sshwy's Notes


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM