前言
看完Vfleaking大爺 炫酷反演魔術
感覺自己走入了個新世界,被震撼到了。
瞬間學會絕大部分有關反演的東東。
這裏小結一哈。
二項式反演
先看一道神奇的題目:
給你n個人排隊,要求第i個人不能站在第i個位置上。求方案數。
n<=105
我知道你們心裏想着那個叫做錯排問題公式的東西。
但是這不是重點。(雖說這個公式很像容斥)
重點在於在這中間找到一個性質:
首先利用現有的大腦,可以想到一個簡單的容斥:
ans=∑i=0n(−1)i∗Cni∗(n−i)!
其中最重要的是利用到一個性質:
[n==0]=∑i=0n(−1)i∗Cni
這個待會會很有用。
那麼現在我們可以利用這個東東來搞些有趣的東西。
設f(i)表示n個人隨便站的方案。
設g(i)表示n個人都站錯的方案。
則有:
f(n)=∑i=0nCni∗g(i)
那麼考慮變化一下讓f來表示g。
現在有:
g(n)=∑i=0n[n−i==0]∗Cni∗g(i)(這是個非常非常顯然的東西)
和之前得到的:
[n==0]=∑i=0n(−1)i∗Cni
兩個搞拼在一起得到:
g(n)=∑i=0n∑j=0n−i(−1)j∗Cn−ij∗Cni∗g(i)
我們發現,中間的組合數似乎可以變化一下。
Cn−ij∗Cni=Cn−ji∗Cnj
代入:
g(n)=∑i=0n∑j=0n−i(−1)j∗Cn−ji∗Cnj∗g(i)
把兩個西格瑪換一下,然後移動一下:
g(n)=∑j=0n(−1)j∗Cnj∗∑i=0n−jCn−ji∗g(i)
發現了什麼?右邊的不是f嗎?!!
恭喜得到:
g(n)=∑j=0n(−1)j∗Cnj∗f(n−j)
這就是二項式反演!
莫比烏斯反演
現在知道反演大致是個什麼東西了。
那麼那個姓莫的先生的反演呢?
其實思路也是差不多的。
來,先上一道題:
構造長度爲n的由小寫字母組成的字符串,使得其中循環節長度恰好爲n。
求方案。
n<=109
那麼上反演基本套路:
設f(n)表示胡亂構造的方案。
設g(n)表示循環節長度爲n的構造方案。
再次發揮人類大腦的智慧,得到:
f(n)=∑d∣ng(d)
這個可不可以用上面的套路來反演呢?
上面的套路就是:一個非常非常顯然的東西與一個比較重要的結論拼♂在一起然後化柿子得到。
首先那個非常非常顯然的東西就是:
g(n)=∑d∣n[dn==1]∗g(d)
那個重要結論是什麼呢?
我們的莫比烏斯函數:
在這裏,我們發現,需要用到的就是下面這個東東:
∑i∣nμ(i)=[n==1]
這個可以感性理解理解這是對的。
接下來,乖乖坐♂好,把手扶♂穩,要開始開♂車了。
g(n)=∑d∣n∑i∣dnμ(i)∗g(d)
再回顧一下,之前是在組合數上搞事,現在我們把目標轉向那個下標:
i∣dn=i∗d∣n=d∣in
那麼就可以交換一下下標了:
g(n)=∑i∣n∑d∣inμ(i)∗g(d)
換一哈:
g(n)=∑i∣nμ(i)∗∑d∣ing(d)
右邊不就是f嗎?
g(n)=∑i∣nμ(i)∗f(in)
似曾相識?
這就是我們的大莫比烏斯反演。
兩個反演的背後
其實反演起來都很像一個東東:
給你一個矩陣,求其逆矩陣。
你問我逆矩陣怎麼搞?
這裏放個定理自己去搞吧:
A−1=∣A∣1∗A∗
其中∣A∣是行列式,A∗是伴隨矩陣,相當於餘子式轉置一下。
當我們找到其中規律我們可以結合上面反演可知:
我們其實就是在利用下三角矩陣的性質來推導。
妙啊!
恭喜獲得成就。發現:求逆矩陣=反演
反演的一般形式
看到上面這麼多幹貨後,是否可以總結出什麼?
看到一般形式:
f(n)=∑i=0na[n][i]∗g(i)
那麼我們一定可以找到一個非常非常顯然的東西:
g(n)=∑i=0n[n−i==0]g(i)
然後找到一個重要性質:設那個東西爲μ(n,j)表示f(j)對g的貢獻。
必定有:∑j=0na[n][j]∗μ(j,k)=[n−k==0]
兩個拼在一起後隨便化化即可得到:
g(n)=∑i=0nμ(n,i)∗f(i)
你以爲這樣就無敵了?其實也不然,這個μ其實有時候倒是很難推的。
然而我並沒有做太多的題,等到做更多的題後再補。
子集反演
你以爲反演都很easy?(的確)
來,給你這個東東:
現在有兩個長度都爲2n的數列
a0,a1,a2,……,a2n−1
b0,b1,b2,……,b2n−1
然後讓你求:數列c
cr=∑p,q=02n−1[p or q=r]∗ap∗bq
n<=20
FWT?顯然OK。
但是這是反演學習,所以⑧要想那玩意兒。
顯然無法直接反演。
那就挖挖性質。
我們發現,原式其實就是相當於p∪q=r時給r做貢獻。
而這個其實相當於:
[p∪q⊆s]=>[p⊆s][q⊆s]
那就把答案換一下:
設as′=∑p⊆sap
那麼cr′表示爲:
cr′=∑p,q=02n−1[p∪q⊆r]∗ap∗bq
cr′=∑p,q=02n−1[p⊆r][q⊆r]∗ap∗bq
移項!
cr′=∑p=02n−1[p⊆r]∗ap∗∑q=02n−1[q⊆r]∗bq
替換:
cr′=ar′∗br′
現在,我們發現,右邊的柿子ar′∗br′可以很容易DP搞出來。
那麼意味着,cr′也弄出來了。
所以現在的問題就是怎麼求cr了。
那就開始反演。
設f(p)表示cp′
設g(r)表示cr
f(p)=∑r⊆pg(r)
其實很簡單,那就當做複習啦。
一個非常非常顯然的東東:
g(r)=∑p⊆r[p==r]g(p)
一個比較重要的結論:
∑x⊆y(−1)∣x∣=[y==0]
代入:
g(r)=∑p⊆r∑x⊆r−p(−1)∣x∣∗g(p)
g(r)=∑x⊆r(−1)∣x∣∗∑p⊆r−xg(p)
g(r)=∑x⊆r(−1)∣x∣∗∑p⊆r−xg(p)
g(r)=∑x⊆r(−1)∣x∣∗f(r−x)
似曾相識?
這就是這個披着神祕面紗的子集反演。
這個可以幹什麼呢?
當然,FWT的它都能幹(只是時間巨慢)
還有!
可以求下標換爲:gcd,lcm的情況。
恭喜獲得成就。發現:FWT=反演
還可以拓展一下:
把條件改一下,變成可以有多個重複的元素。
其實也很簡單。
設μ(s)表示如果s有重複元素,那麼就是0,否則就是(−1)∣s∣
類似於莫比烏斯,隨便反演即可。
離散傅里葉變換DFT
等等,這個奇怪的東東怎麼在這裏出現了?
連FWT都出現了,這個怎麼不可以有?
現在有兩個長度都爲n的數列
a0,a1,a2,……,an−1
b0,b1,b2,……,bn−1
然後讓你求:數列c
cr=∑p,q=0n−1[(p+q) mod n==r]∗ap∗bq
n<=220
既然是DFT怎麼能少了單位根?
我們熟悉的求和引理:
i=0∑n−1(ωnk)i=1−ωnk1−(ωnk)n=1−ωnk1−(ωnn)k=0
滿足這條柿子有個要求,就是k mod n!=0
那麼再劃一下柿子,變成:
n1i=0∑n−1(ωnk)i=[k mod n==0]
代入原式看看會發生什麼奇妙的化學變化。
cr=∑p,q=0n−1[(p+q−r) mod n==0]∗ap∗bq
cr=∑p,q=0n−1n1∑i=0n−1(ωnp+q−r)i∗ap∗bq
把中間的單位根拆掉。
cr=∑p,q=0n−1n1∑i=0n−1ωnp∗i∗ωnq∗i∗ωn−r∗i∗ap∗bq
cr=n1∑i=0n−1ωn−r∗i∗∑p=0n−1ωnp∗i∗ap∗∑q=0n−1ωnq∗i∗bq
於是乎,這個式子就可以用神奇的分治來做啦~
恭喜獲得成就。發現:DFT或FFT=反演
其實上面的思路也差不多多是這樣的:
把[F(p+q)==r]拆成兩個獨立的部分,然後分開來做。
舉個例子就類似於[d∣gcd(a,b)]可以拆成[d∣a]和[d∣b]
是不是很神奇?
小結
大家可能看完這個之後,突然大徹大悟,猶如醍醐灌頂。原來反演都是一家人(廢話)
如果找點看到這個玩意可能就不至於看個莫比烏斯反演看那麼久了。(雖說它的難點在於那個奇妙的分塊)
不管怎樣,反演怎麼看都是個好東東。可能以後看到什麼奇妙的題就有些新的思路了。
哪裏不會反演哪裏,媽媽再也不用擔心我的數學啦!