學習反演小計

前言

看完Vfleaking大爺 炫酷反演魔術
感覺自己走入了個新世界,被震撼到了。
瞬間學會絕大部分有關反演的東東。

這裏小結一哈。

二項式反演

先看一道神奇的題目:
給你n個人排隊,要求第i個人不能站在第i個位置上。求方案數。
n<=105n<=10^5
我知道你們心裏想着那個叫做錯排問題公式的東西。
在這裏插入圖片描述
但是這不是重點。(雖說這個公式很像容斥)
重點在於在這中間找到一個性質:
首先利用現有的大腦,可以想到一個簡單的容斥:
ans=i=0n(1)iCni(ni)!ans=\sum_{i=0}^n(-1)^i*C_n^i*(n-i)!
其中最重要的是利用到一個性質:
[n==0]=i=0n(1)iCni[n==0]=\sum_{i=0}^n(-1)^i*C_n^i
這個待會會很有用。

那麼現在我們可以利用這個東東來搞些有趣的東西。
設f(i)表示n個人隨便站的方案。
設g(i)表示n個人都站錯的方案。

則有:
f(n)=i=0nCnig(i)f(n)=\sum_{i=0}^nC_n^i*g(i)
那麼考慮變化一下讓f來表示g。
現在有:
g(n)=i=0n[ni==0]Cnig(i)g(n)=\sum_{i=0}^n[n-i==0]*C_n^i*g(i)(這是個非常非常顯然的東西)
和之前得到的:
[n==0]=i=0n(1)iCni[n==0]=\sum_{i=0}^n(-1)^i*C_n^i
兩個拼在一起得到:
g(n)=i=0nj=0ni(1)jCnijCnig(i)g(n)=\sum_{i=0}^n\sum_{j=0}^{n-i}(-1)^j*C_{n-i}^j*C_n^i*g(i)
我們發現,中間的組合數似乎可以變化一下。
CnijCni=CnjiCnjC_{n-i}^j*C_n^i=C_{n-j}^i*C_n^j
代入:
g(n)=i=0nj=0ni(1)jCnjiCnjg(i)g(n)=\sum_{i=0}^n\sum_{j=0}^{n-i}(-1)^j*C_{n-j}^i*C_n^j*g(i)
把兩個西格瑪換一下,然後移動一下:
g(n)=j=0n(1)jCnji=0njCnjig(i)g(n)=\sum_{j=0}^n(-1)^j*C_n^j*\sum_{i=0}^{n-j}C_{n-j}^i*g(i)
發現了什麼?右邊的不是f嗎?!!
恭喜得到:
g(n)=j=0n(1)jCnjf(nj)g(n)=\sum_{j=0}^n(-1)^j*C_n^j*f(n-j)
這就是二項式反演!
在這裏插入圖片描述

莫比烏斯反演

現在知道反演大致是個什麼東西了。
那麼那個姓莫的先生的反演呢?
其實思路也是差不多的。

來,先上一道題:
構造長度爲n的由小寫字母組成的字符串,使得其中循環節長度恰好爲n。
求方案。
n<=109n<=10^9

那麼上反演基本套路:
設f(n)表示胡亂構造的方案。
設g(n)表示循環節長度爲n的構造方案。

再次發揮人類大腦的智慧,得到:
f(n)=dng(d)f(n)=\sum_{d|n}g(d)
這個可不可以用上面的套路來反演呢?
上面的套路就是:一個非常非常顯然的東西與一個比較重要的結論拼♂在一起然後化柿子得到。
首先那個非常非常顯然的東西就是:
g(n)=dn[nd==1]g(d)g(n)=\sum_{d|n}[\frac n d==1]*g(d)
那個重要結論是什麼呢?
我們的莫比烏斯函數:
在這裏插入圖片描述
在這裏,我們發現,需要用到的就是下面這個東東:
inμ(i)=[n==1]\sum_{i|n}\mu (i)=[n==1]
這個可以感性理解理解這是對的。

接下來,乖乖坐♂好,把手扶♂穩,要開始開♂車了。
g(n)=dnindμ(i)g(d)g(n)=\sum_{d|n}\sum_{i|\frac n d}\mu (i)*g(d)
再回顧一下,之前是在組合數上搞事,現在我們把目標轉向那個下標:
ind=idn=dnii|\frac n d=i*d|n=d|\frac n i
那麼就可以交換一下下標了:
g(n)=indniμ(i)g(d)g(n)=\sum_{i|n}\sum_{d|\frac n i}\mu (i)*g(d)
換一哈:
g(n)=inμ(i)dnig(d)g(n)=\sum_{i|n}\mu (i)*\sum_{d|\frac n i}g(d)
右邊不就是f嗎?
g(n)=inμ(i)f(ni)g(n)=\sum_{i|n}\mu (i)*f(\frac n i)
似曾相識?
這就是我們的大莫比烏斯反演。
在這裏插入圖片描述

兩個反演的背後

其實反演起來都很像一個東東:
給你一個矩陣,求其逆矩陣。

你問我逆矩陣怎麼搞?
這裏放個定理自己去搞吧:
A1=1AAA^{-1}=\frac 1 {|A|}*A^*
其中A|A|是行列式,AA^*是伴隨矩陣,相當於餘子式轉置一下。
當我們找到其中規律我們可以結合上面反演可知:
我們其實就是在利用下三角矩陣的性質來推導。

在這裏插入圖片描述

妙啊!
恭喜獲得成就。發現:求逆矩陣=反演

反演的一般形式

看到上面這麼多幹貨後,是否可以總結出什麼?
看到一般形式:
f(n)=i=0na[n][i]g(i)f(n)=\sum_{i=0}^na[n][i]*g(i)
那麼我們一定可以找到一個非常非常顯然的東西:
g(n)=i=0n[ni==0]g(i)g(n)=\sum_{i=0}^n[n-i==0]g(i)
然後找到一個重要性質:設那個東西爲μ(n,j)\mu(n,j)表示f(j)f(j)對g的貢獻。
必定有:j=0na[n][j]μ(j,k)=[nk==0]\sum_{j=0}^na[n][j]*\mu(j,k)=[n-k==0]
兩個拼在一起後隨便化化即可得到:
g(n)=i=0nμ(n,i)f(i)g(n)=\sum_{i=0}^n\mu(n,i)*f(i)

你以爲這樣就無敵了?其實也不然,這個μ\mu其實有時候倒是很難推的。
然而我並沒有做太多的題,等到做更多的題後再補。

子集反演

你以爲反演都很easy?(的確)

來,給你這個東東:
現在有兩個長度都爲2n2^n的數列
a0,a1,a2,,a2n1a_0,a_1,a_2,……,a_{2^n-1}
b0,b1,b2,,b2n1b_0,b_1,b_2,……,b_{2^n-1}
然後讓你求:數列c
cr=p,q=02n1[p or q=r]apbqc_r=\sum_{p,q=0}^{2^n-1}[p\ or\ q=r]*a_p*b_q
n<=20n<=20

FWT?顯然OK。

但是這是反演學習,所以⑧要想那玩意兒。
顯然無法直接反演。

那就挖挖性質。
我們發現,原式其實就是相當於pq=rp \cup q=r時給r做貢獻。
而這個其實相當於:
[pqs]=>[ps][qs][p \cup q\subseteq s]=>[p\subseteq s][q\subseteq s]
那就把答案換一下:
as=psapa'_s=\sum_{p\subseteq s}a_p
那麼crc'_r表示爲:
cr=p,q=02n1[pqr]apbqc'_r=\sum_{p,q=0}^{2^n-1}[p \cup q\subseteq r]*a_p*b_q

cr=p,q=02n1[pr][qr]apbqc'_r=\sum_{p,q=0}^{2^n-1}[p\subseteq r][q\subseteq r]*a_p*b_q
移項!
cr=p=02n1[pr]apq=02n1[qr]bqc'_r=\sum_{p=0}^{2^n-1}[p\subseteq r]*a_p*\sum_{q=0}^{2^n-1}[q\subseteq r]*b_q
替換:
cr=arbrc'_r=a'_r*b'_r
現在,我們發現,右邊的柿子arbra'_r*b'_r可以很容易DP搞出來。
那麼意味着,crc'_r也弄出來了。
所以現在的問題就是怎麼求crc_r了。

那就開始反演。
f(p)f(p)表示cpc'_p
g(r)g(r)表示crc_r
f(p)=rpg(r)f(p)=\sum_{r\subseteq p}g(r)
其實很簡單,那就當做複習啦。
一個非常非常顯然的東東:
g(r)=pr[p==r]g(p)g(r)=\sum_{p\subseteq r}[p==r]g(p)
一個比較重要的結論:
xy(1)x=[y==0]\sum_{x\subseteq y}(-1)^{|x|}=[y==0]
代入:
g(r)=prxrp(1)xg(p)g(r)=\sum_{p\subseteq r}\sum_{x\subseteq r-p}(-1)^{|x|}*g(p)

g(r)=xr(1)xprxg(p)g(r)=\sum_{x\subseteq r}(-1)^{|x|}*\sum_{p\subseteq r-x}g(p)

g(r)=xr(1)xprxg(p)g(r)=\sum_{x\subseteq r}(-1)^{|x|}*\sum_{p\subseteq r-x}g(p)

g(r)=xr(1)xf(rx)g(r)=\sum_{x\subseteq r}(-1)^{|x|}*f(r-x)

似曾相識?
這就是這個披着神祕面紗的子集反演。

這個可以幹什麼呢?
當然,FWT的它都能幹(只是時間巨慢)
還有!
可以求下標換爲:gcd,lcm的情況。

在這裏插入圖片描述

恭喜獲得成就。發現:FWT=反演

還可以拓展一下:
把條件改一下,變成可以有多個重複的元素。

其實也很簡單。
μ(s)\mu(s)表示如果ss有重複元素,那麼就是00,否則就是(1)s(-1)^{|s|}
類似於莫比烏斯,隨便反演即可。

離散傅里葉變換DFT

等等,這個奇怪的東東怎麼在這裏出現了?
連FWT都出現了,這個怎麼不可以有?

現在有兩個長度都爲nn的數列
a0,a1,a2,,an1a_0,a_1,a_2,……,a_{n-1}
b0,b1,b2,,bn1b_0,b_1,b_2,……,b_{n-1}
然後讓你求:數列c
cr=p,q=0n1[(p+q) mod n==r]apbqc_r=\sum_{p,q=0}^{n-1}[(p+q)\ mod\ n==r]*a_p*b_q
n<=220n<=2^{20}

既然是DFT怎麼能少了單位根?
我們熟悉的求和引理:
i=0n1(ωnk)i=1(ωnk)n1ωnk=1(ωnn)k1ωnk=0\sum_{i=0}^{n-1}(\omega^k_n)^i=\frac{1-(\omega_n^k)^n}{1-\omega_n^k}=\frac{1-(\omega_n^n)^k}{1-\omega_n^k}=0

滿足這條柿子有個要求,就是k mod n!=0k\ mod\ n!=0
那麼再劃一下柿子,變成:

1ni=0n1(ωnk)i=[k mod n==0]\frac 1 n\sum_{i=0}^{n-1}(\omega^k_n)^i=[k\ mod\ n==0]

代入原式看看會發生什麼奇妙的化學變化。

cr=p,q=0n1[(p+qr) mod n==0]apbqc_r=\sum_{p,q=0}^{n-1}[(p+q-r)\ mod\ n==0]*a_p*b_q

cr=p,q=0n11ni=0n1(ωnp+qr)iapbqc_r=\sum_{p,q=0}^{n-1}\frac 1 {n}\sum_{i=0}^{n-1}(\omega^{p+q-r}_n)^i*a_p*b_q
把中間的單位根拆掉。
cr=p,q=0n11ni=0n1ωnpiωnqiωnriapbqc_r=\sum_{p,q=0}^{n-1}\frac 1 {n}\sum_{i=0}^{n-1}\omega_n^{p*i}*\omega_n^{q*i}*\omega_n^{-r*i}*a_p*b_q

cr=1ni=0n1ωnrip=0n1ωnpiapq=0n1ωnqibqc_r=\frac 1 {n}\sum_{i=0}^{n-1}\omega_n^{-r*i}*\sum_{p=0}^{n-1}\omega_n^{p*i}*a_p*\sum_{q=0}^{n-1}\omega_n^{q*i}*b_q

於是乎,這個式子就可以用神奇的分治來做啦~

在這裏插入圖片描述

恭喜獲得成就。發現:DFT或FFT=反演

其實上面的思路也差不多多是這樣的:

[F(p+q)==r][F(p+q)==r]拆成兩個獨立的部分,然後分開來做。
舉個例子就類似於[dgcd(a,b)][d|gcd(a,b)]可以拆成[da][d|a][db][d|b]
是不是很神奇?

小結

大家可能看完這個之後,突然大徹大悟,猶如醍醐灌頂。原來反演都是一家人(廢話)
如果找點看到這個玩意可能就不至於看個莫比烏斯反演看那麼久了。(雖說它的難點在於那個奇妙的分塊)
不管怎樣,反演怎麼看都是個好東東。可能以後看到什麼奇妙的題就有些新的思路了。

哪裏不會反演哪裏,媽媽再也不用擔心我的數學啦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章