对于容斥原理反演的思考和总结
前言
我还是太菜了
容斥之类的方法并不能熟练应用
于是这次我就认真学习了一下容斥
你可能会发现,容斥与反演很多时候都会同时出现
那么,这两个东西分别是什么、究竟有什么关系呢?
容斥
我们先从定义说起
什么是容斥?
容斥原理: 先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理
贴出最经典的容斥原理的式子
设现在有nnn个条件P1,P2⋅⋅⋅PnP_1,P_2···P_nP1,P2⋅⋅⋅Pn,满足这些条件的集合分别是A1,A2⋅⋅⋅AnA_1,A_2···A_nA1,A2⋅⋅⋅An
∣A1∪A2∪...∪An∣=∑i=1n(−1)i−1∑∣T∣=i,T={x1...xi}∣Ax1∩Ax2∩...∩Axi∣|{A_1}\cup{A_2}\cup...\cup{A_n}|=\sum_{i=1}^n(-1)^{i-1}\sum_{|T|=i,T=\{x_1...x_i\}}|{A_{x_1}}\cap{A_{x_2}}\cap...\cap{A_{x_i}}|∣A1∪A2∪...∪An∣=i=1∑n(−1)i−1∣T∣=i,T={x1...xi}∑∣Ax1∩Ax2∩...∩Axi∣
当直接计算左式并不方便的时候,就能转化成右式解决问题了
证明:
对于某个∣T∣=i,T={x1...xi}|T|=i,T=\{x_1...x_i\}∣T∣=i,T={x1...xi},其对应的集合为∣Ax1∩Ax2∩...∩Axi∣|{A_{x_1}}\cap{A_{x_2}}\cap...\cap{A_{x_i}}|∣Ax1∩Ax2∩...∩Axi∣,它应当被计算一次,我们现在来进行证明
它被计算的次数根据组合数可得:
Ans=∑j=1i(−1)j−1(ij)=−(∑j=1i(−1)j(ij))+1−1=1−(∑j=0i(−1)j(ij))=1−(∑j=0i(−1)j1i−j(ij))=1−(1−1)j=1\begin{aligned} Ans&=\sum_{j=1}^i(-1)^{j-1}\binom{i}{j}\\ &=-(\sum_{j=1}^i(-1)^j\binom{i}{j})+1-1\\ &=1-(\sum_{j=0}^i(-1)^j\binom{i}{j})\\ &=1-(\sum_{j=0}^i(-1)^j1^{i-j}\binom{i}{j})\\ &=1-(1-1)^j\\ &=1 \end{aligned}Ans=j=1∑i(−1)j−1(ji)=−(j=1∑i(−1)j(ji))+1−1=1−(j=0∑i(−1)j(ji))=1−(j=0∑i(−1)j1i−j(ji))=1−(1−1)j=1
中间用到的是二项式定理(百度百科链接),然后证毕
在实际使用容斥的时候,我们如果要计算所有条件都不满足的方案数,只要用全集减就好了,即∣A1‾∩A2‾∩...∩An‾∣=∣U∣−∣A1∪A2∪...∪An∣|\overline{A_1}\cap\overline{A_2}\cap...\cap\overline{A_n}|=|U|-|{A_1}\cup{A_2}\cup...\cup{A_n}|∣A1∩A2∩...∩An∣=∣U∣−∣A1∪A2∪...∪An∣
例题:[bzoj4455]小星星
反演
我对反演的理解
什么是反演呢?
有两个数组f,gf,gf,g,已知他们之间的关系:fi=∑j=0iai,jgjf_i=\sum_{j=0}^ia_{i,j}g_jfi=j=0∑iai,jgj
现在你获得了所有的fff的值,求每个ggg的值
考虑这件事请的本质,相当于是给你nnn个线性方程
a0,0g0+a0,1g1⋅⋅⋅a0,ngn=f0a1,0g0+a1,1g1⋅⋅⋅a1,ngn=f1⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅=⋅⋅⋅an,0g0+an,1g1⋅⋅⋅an,ngn=fn\begin{aligned} a_{0,0}g_0+a_{0,1}g_1···a_{0,n}g_n&=f_0\\ a_{1,0}g_0+a_{1,1}g_1···a_{1,n}g_n&=f_1\\ ···\ \ \ \ \ \ \ \ ···\ \ \ ···\ \ ···\ \ \ &=\ ···\\ a_{n,0}g_0+a_{n,1}g_1···a_{n,n}g_n&=f_n\\ \end{aligned}a0,0g0+a0,1g1⋅⋅⋅a0,ngna1,0g0+a1,1g1⋅⋅⋅a1,ngn⋅⋅⋅ ⋅⋅⋅ ⋅⋅⋅ ⋅⋅⋅ an,0g0+an,1g1⋅⋅⋅an,ngn=f0=f1= ⋅⋅⋅=fn
已知所有的aaa和fff,求ggg
很不幸的是,这个直接高斯消元的复杂度是Θ(n3)\Theta(n^3)Θ(n3)的,不够优越
但是我们发现这里有一个性质,那就是所有ai,ja_{i,j}ai,j满足i<ji<ji<j的值都是000
那么也就是说这是一个下三角矩阵,那么直接高斯消元就是Θ(n2)\Theta(n^2)Θ(n2)的了
真是非常优越,但是当前这个算法并不能Θ(n)\Theta(n)Θ(n)求单个gig_igi的值
考虑Θ(n2)\Theta(n^2)Θ(n2)高斯消元的过程,我们发现对于gig_igi的值有影响的fjf_jfj一定满足j≤ij\le ij≤i,并且贡献为一个系数bi,jb_{i,j}bi,j(这个系数可以从aaa推过来)
如果我们有办法快速的能将bbb求出来,那么我们就能Θ(n)\Theta(n)Θ(n)的求单个gig_igi的值了
事实上,对于随便的一组aaa并没有办法快速求出bbb,但是如果aaa比较特殊那就可以
已知一组aaa,找到一组bbb满足:fi=∑j=0iai,jgj⇔gi=∑j=0ibi,jfjf_i=\sum_{j=0}^ia_{i,j}g_j\Leftrightarrow g_i=\sum_{j=0}^ib_{i,j}f_jfi=j=0∑iai,jgj⇔gi=j=0∑ibi,jfj
以上是常见反演的形式,之后的讲解以此类为主
ex(拓展)
当然反演还有一个更广义的形式,在下个部分中也会有exexex这一项提到这个
fi=∑j=0nai,jgj⇔gi=∑j=0nbi,jfjf_i=\sum_{j=0}^{n}a_{i,j}g_j\Leftrightarrow g_i=\sum_{j=0}^{n}b_{i,j}f_jfi=j=0∑nai,jgj⇔gi=j=0∑nbi,jfj
容易发现这个形式相当于是线性方程组的系数都是有值的,自然反演过来跟gig_igi有关的也是所有的fif_ifi了
反演的a,ba,ba,b之间的关系
既然我们是已知aaa求bbb,那么aaa和bbb之间一定有某种关系
首先我们引入克罗内克函数(Kronecker delta)
δij={0,i≠j1,i=j\delta_{ij}=\begin{cases}0,i\ne j\\ 1,i=j \end{cases}δij={0,i̸=j1,i=j
是不是看起来非常简单呢
然后就有个同样很显然的式子fi=∑j=0iδijfjf_i=\sum_{j=0}^i\delta_{ij}f_jfi=j=0∑iδijfj
然后我们回到式子fi=∑j=0iai,jgj⇔gi=∑j=0ibi,jfjf_i=\sum_{j=0}^ia_{i,j}g_j\Leftrightarrow g_i=\sum_{j=0}^ib_{i,j}f_jfi=j=0∑iai,jgj⇔gi=j=0∑ibi,jfj把第二个式子代入第一个式子
fi=∑j=0iai,jgj=∑j=0iai,j∑k=0jbj,kfk=∑k=0i(∑j=kiai,jbj,k)fk\begin{aligned}f_i&=\sum_{j=0}^ia_{i,j}g_j\\ &=\sum_{j=0}^ia_{i,j}\sum_{k=0}^jb_{j,k}f_k\\ &=\sum_{k=0}^i(\sum_{j=k}^ia_{i,j}b_{j,k})f_k \end{aligned}fi=j=0∑iai,jgj=j=0∑iai,jk=0∑jbj,kfk=k=0∑i(j=k∑iai,jbj,k)fk
发现和前面的式子非常像
得出∑j=kiai,jbj,k=δi,k\sum_{j=k}^ia_{i,j}b_{j,k}=\delta_{i,k}j=k∑iai,jbj,k=δi,k
如果a,ba,ba,b满足这个式子,那么上面的反演就可以成立了,如果一个反演是成立的,那么其也一定满足这个式子
ex(拓展)
考虑广义的反演
fi=∑j=0nai,jgj⇔gi=∑j=0nbi,jfjf_i=\sum_{j=0}^{n}a_{i,j}g_j\Leftrightarrow g_i=\sum_{j=0}^{n}b_{i,j}f_jfi=j=0∑nai,jgj⇔gi=j=0∑nbi,jfj
它也有相应的判定式子∑j=0nai,jbj,k=δi,k\sum_{j=0}^na_{i,j}b_{j,k}=\delta_{i,k}j=0∑nai,jbj,k=δi,k
证明同理,有兴趣的同学可以自己手推
常见的反演
二项式反演
二项式这个东西非常常见,它也对应了一个非常经典的反演——二项式反演
二项式反演有两种式子,我们来分别证明吧
经典式
fi=∑j=0i(−1)j(ij)gj⇔gi=∑j=0i(−1)j(ij)fjf_i=\sum_{j=0}^i(-1)^j\binom{i}{j}g_j\Leftrightarrow g_i=\sum_{j=0}^i(-1)^j\binom{i}{j}f_jfi=j=0∑i(−1)j(ji)gj⇔gi=j=0∑i(−1)j(ji)fj
列出a,ba,ba,b的值,ai,j=(−1)j(ij),bi,j=(−1)j(ij)a_{i,j}=(-1)^j\binom{i}{j},b_{i,j}=(-1)^j\binom{i}{j}ai,j=(−1)j(ji),bi,j=(−1)j(ji)
代入
∑j=kiai,jbj,k=∑j=ki(−1)j(ij)∗(−1)k(jk)=∑j=ki(−1)j+k(ij)(jk)=∑j=ki(−1)j+k(ik)(i−ki−j)=(ik)(−1)k∑j=ki(−1)j(i−ki−j)=(ik)(−1)k∑j=0i−k(−1)i−j(i−kj)={(ik)(−1)k(1−1)i−k(i≠k)(ik)(−1)k(i=k)={0(i≠k)1(i=k)=δi,k\begin{aligned} \sum_{j=k}^ia_{i,j}b_{j,k}&=\sum_{j=k}^i(-1)^j\binom{i}{j}*(-1)^k\binom{j}{k}\\ &=\sum_{j=k}^i(-1)^{j+k}\binom{i}{j}\binom{j}{k}\\ &=\sum_{j=k}^i(-1)^{j+k}\binom{i}{k}\binom{i-k}{i-j}\\ &=\binom{i}{k}(-1)^k\sum_{j=k}^i(-1)^j\binom{i-k}{i-j}\\ &=\binom{i}{k}(-1)^k\sum_{j=0}^{i-k}(-1)^{i-j}\binom{i-k}{j}\\ &=\begin{cases} \binom{i}{k}(-1)^k(1-1)^{i-k}&(i\neq k)\\ \binom{i}{k}(-1)^k&(i=k) \end{cases}\\ &=\begin{cases} 0&(i\neq k)\\ 1&(i=k) \end{cases}\\ &=\delta_{i,k} \end{aligned}j=k∑iai,jbj,k=j=k∑i(−1)j(ji)∗(−1)k(kj)=j=k∑i(−1)j+k(ji)(kj)=j=k∑i(−1)j+k(ki)(i−ji−k)=(ki)(−1)kj=k∑i(−1)j(i−ji−k)=(ki)(−1)kj=0∑i−k(−1)i−j(ji−k)={(ki)(−1)k(1−1)i−k(ki)(−1)k(i̸=k)(i=k)={01(i̸=k)(i=k)=δi,k
补充一下,对于中间有一部用到了如下式子:
(ab)(bc)=a!b!(a−b)!⋅b!c!(b−c)!=a!(a−b)!c!(b−c)!=a!c!(a−c)!⋅(a−c)!(a−b)!(b−c)!=(ac)(a−ca−b)\begin{aligned} \binom{a}{b}\binom{b}{c}&=\frac{a!}{b!(a-b)!}·\frac{b!}{c!(b-c)!}\\ &=\frac{a!}{(a-b)!c!(b-c)!}\\ &=\frac{a!}{c!(a-c)!}·\frac{(a-c)!}{(a-b)!(b-c)!}\\ &=\binom{a}{c}\binom{a-c}{a-b} \end{aligned}(ba)(cb)=b!(a−b)!a!⋅c!(b−c)!b!=(a−b)!c!(b−c)!a!=c!(a−c)!a!⋅(a−b)!(b−c)!(a−c)!=(ca)(a−ba−c)
更常用的式子:
fi=∑j=0i(ij)gj⇔gi=∑j=0i(−1)i−j(ij)fjf_i=\sum_{j=0}^i\binom{i}{j}g_j\Leftrightarrow g_i=\sum_{j=0}^i(-1)^{i-j}\binom{i}{j}f_jfi=j=0∑i(ji)gj⇔gi=j=0∑i(−1)i−j(ji)fj
同样可以证明
列出a,ba,ba,b的值:ai,j=(ij),bi,j=(−1)i−j(ij)a_{i,j}=\binom{i}{j},b_{i,j}=(-1)^{i-j}\binom{i}{j}ai,j=(ji),bi,j=(−1)i−j(ji)
代入
∑j=kiai,jbj,k=∑j=ki(ij)∗(−1)j−k(jk)=∑j=ki(ij)∗(−1)j−k(jk)∗(−1)k+k=∑j=ki(−1)j+k(ij)(jk)=δi,k\begin{aligned} \sum_{j=k}^ia_{i,j}b_{j,k}&=\sum_{j=k}^i\binom{i}{j}*(-1)^{j-k}\binom{j}{k}\\ &=\sum_{j=k}^i\binom{i}{j}*(-1)^{j-k}\binom{j}{k}*(-1)^{k+k}\\ &=\sum_{j=k}^i(-1)^{j+k}\binom{i}{j}\binom{j}{k}\\ &=\delta_{i,k} \end{aligned}j=k∑iai,jbj,k=j=k∑i(ji)∗(−1)j−k(kj)=j=k∑i(ji)∗(−1)j−k(kj)∗(−1)k+k=j=k∑i(−1)j+k(ji)(kj)=δi,k
容易发现,代入以后稍微转化一下就和第一个式子的证明一样了
当然,二项式反演还有一个形式(其实本质相同)
fi=∑j=0i(n−jn−i)gj⇔gi=∑j=0i(−1)i−j(n−jn−i)fjf_i=\sum_{j=0}^i\binom{n-j}{n-i}g_j\Leftrightarrow g_i=\sum_{j=0}^i(-1)^{i-j}\binom{n-j}{n-i}f_jfi=j=0∑i(n−in−j)gj⇔gi=j=0∑i(−1)i−j(n−in−j)fj
列出a,ba,ba,b的值:ai,j=(n−jn−i),bi,j=(−1)i−j(n−jn−i)a_{i,j}=\binom{n-j}{n-i},b_{i,j}=(-1)^{i-j}\binom{n-j}{n-i}ai,j=(n−in−j),bi,j=(−1)i−j(n−in−j)
代入
∑j=kiai,jbj,k=∑j=ki(n−jn−i)∗(−1)j−k(n−kn−j)=∑j=ki(n−jn−i)∗(−1)j−k(n−kn−j)∗(−1)k+k=∑j=ki(−1)j+k(n−kn−j)(n−jn−i)=∑j=ki(−1)j+k(n−kn−i)(i−ki−j)=(n−kn−i)(−1)k∑j=ki(−1)j(i−ki−j)=(n−kn−i)(−1)k∑j=0i−k(−1)i−j(i−kj)={(n−kn−i)(−1)k(1−1)i−k(i≠k)(n−kn−i)(−1)k(i=k)={0(i≠k)1(i=k)=δi,k\begin{aligned} \sum_{j=k}^ia_{i,j}b_{j,k}&=\sum_{j=k}^i\binom{n-j}{n-i}*(-1)^{j-k}\binom{n-k}{n-j}\\ &=\sum_{j=k}^i\binom{n-j}{n-i}*(-1)^{j-k}\binom{n-k}{n-j}*(-1)^{k+k}\\ &=\sum_{j=k}^i(-1)^{j+k}\binom{n-k}{n-j}\binom{n-j}{n-i}\\ &=\sum_{j=k}^i(-1)^{j+k}\binom{n-k}{n-i}\binom{i-k}{i-j}\\ &=\binom{n-k}{n-i}(-1)^k\sum_{j=k}^i(-1)^j\binom{i-k}{i-j}\\ &=\binom{n-k}{n-i}(-1)^k\sum_{j=0}^{i-k}(-1)^{i-j}\binom{i-k}{j}\\ &=\begin{cases} \binom{n-k}{n-i}(-1)^k(1-1)^{i-k}&(i\neq k)\\ \binom{n-k}{n-i}(-1)^k&(i=k) \end{cases}\\ &=\begin{cases} 0&(i\neq k)\\ 1&(i=k) \end{cases}\\ &=\delta_{i,k} \end{aligned}j=k∑iai,jbj,k=j=k∑i(n−in−j)∗(−1)j−k(n−jn−k)=j=k∑i(n−in−j)∗(−1)j−k(n−jn−k)∗(−1)k+k=j=k∑i(−1)j+k(n−jn−k)(n−in−j)=j=k∑i(−1)j+k(n−in−k)(i−ji−k)=(n−in−k)(−1)kj=k∑i(−1)j(i−ji−k)=(n−in−k)(−1)kj=0∑i−k(−1)i−j(ji−k)={(n−in−k)(−1)k(1−1)i−k(n−in−k)(−1)k(i̸=k)(i=k)={01(i̸=k)(i=k)=δi,k
式子通过推导可以变成
f(i)=∑j=in(ji)g(j)⇔g(i)=∑j=in(−1)j−i(ji)f(j)f(i)=\sum_{j=i}^n\binom jig(j)\Leftrightarrow g(i)=\sum_{j=i}^n(-1)^{j-i}\binom jif(j)f(i)=j=i∑n(ij)g(j)⇔g(i)=j=i∑n(−1)j−i(ij)f(j)
大体的过程都挺相似的,例题:[bzoj3622]已经没有什么好害怕的了
斯特林反演
接下来讲斯特林反演啦
预备知识是两类斯特林数
不会的同学可以看我的博客
第一类斯特林数
第二类斯特林数
列出斯特林反演的式子(注意,本式子中的第一类斯特林数是有符号的)
fi=∑j=0i{ij}gj⇔gi=∑j=0i[ij]fjf_i=\sum_{j=0}^i\begin{Bmatrix}i\\j\end{Bmatrix}g_j\Leftrightarrow g_i=\sum_{j=0}^i\begin{bmatrix}i\\j\end{bmatrix}f_jfi=j=0∑i{ij}gj⇔gi=j=0∑i[ij]fj
证明:
首先,我们已知两类斯特林数很好的性质(证明在第二类斯特林数的博客中):xn↓=∑i=0n[ni]xix^{n\downarrow}=\sum_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}x^ixn↓=i=0∑n[ni]xi
xn=∑i=0n{ni}xi↓x^n=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}x^{i\downarrow}xn=i=0∑n{ni}xi↓
(这里插入一道应用例题CF 932 E)
将222式带入111式,得到
xn↓=∑i=0n[ni]xi=∑i=0n[ni]∑j=0i{ij}xj↓=∑i=0n∑j=0i[ni]{ij}xj↓\begin{aligned} x^{n\downarrow}&=\sum_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}x^i\\ &=\sum_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}\sum_{j=0}^i\begin{Bmatrix}i\\j\end{Bmatrix}x^{j\downarrow}\\ &=\sum_{i=0}^n\sum_{j=0}^i\begin{bmatrix}n\\i\end{bmatrix}\begin{Bmatrix}i\\j\end{Bmatrix}x^{j\downarrow}\\ \end{aligned}xn↓=i=0∑n[ni]xi=i=0∑n[ni]j=0∑i{ij}xj↓=i=0∑nj=0∑i[ni]{ij}xj↓
容易发现∑i=0n∑j=0i[ni]{ij}\sum_{i=0}^n\sum_{j=0}^i\begin{bmatrix}n\\i\end{bmatrix}\begin{Bmatrix}i\\j\end{Bmatrix}i=0∑nj=0∑i[ni]{ij}
在n=jn=jn=j的时候等于111,其它时候等于000
即∑i=0n∑j=0i[ni]{ij}=δn,j\sum_{i=0}^n\sum_{j=0}^i\begin{bmatrix}n\\i\end{bmatrix}\begin{Bmatrix}i\\j\end{Bmatrix}=\delta_{n,j}i=0∑nj=0∑i[ni]{ij}=δn,j
根据套路,我们列出a,ba,ba,b的值:ai,j={ij},bi,j=[ij]a_{i,j}=\begin{Bmatrix}i\\j\end{Bmatrix},b_{i,j}=\begin{bmatrix}i\\j\end{bmatrix}ai,j={ij},bi,j=[ij]
∑j=kiai,jbj,k=∑j=ki{ij}[jk]=δi,k\begin{aligned} \sum_{j=k}^ia_{i,j}b_{j,k}&=\sum_{j=k}^i\begin{Bmatrix}i\\j\end{Bmatrix}\begin{bmatrix}j\\k\end{bmatrix}\\ &=\delta_{i,k} \end{aligned}j=k∑iai,jbj,k=j=k∑i{ij}[jk]=δi,k
就得证了
有个更常见的式子(其中的是无符号斯特林数)
fi=∑j=0i{ij}gj⇔gi=∑j=0i(−1)i−j[ij]fjf_i=\sum_{j=0}^i\begin{Bmatrix}i\\j\end{Bmatrix}g_j\Leftrightarrow g_i=\sum_{j=0}^i(-1)^{i-j}\begin{bmatrix}i\\j\end{bmatrix}f_jfi=j=0∑i{ij}gj⇔gi=j=0∑i(−1)i−j[ij]fj
我们可以直接通过ss(n,m)=(−1)n+msu(n,m)s_s(n,m)=(−1)^{n+m}s_u(n,m)ss(n,m)=(−1)n+msu(n,m)来转化
然后就好了
容易发现,这些式子和二项式反演非常相似
所以,斯特林反演也有一个式子(其中的是无符号斯特林数):fi=∑j=0i{n−jn−i}gj⇔gi=∑j=0i(−1)i−j[n−jn−i]fjf_i=\sum_{j=0}^i\begin{Bmatrix}{n-j}\\{n-i}\end{Bmatrix}g_j\Leftrightarrow g_i=\sum_{j=0}^i(-1)^{i-j}\begin{bmatrix}{n-j}\\{n-i}\end{bmatrix}f_jfi=j=0∑i{n−jn−i}gj⇔gi=j=0∑i(−1)i−j[n−jn−i]fj
证明即先知道
∑j=kiai,jbj,k=δi,k\begin{aligned} \sum_{j=k}^ia_{i,j}b_{j,k}&=\delta_{i,k} \end{aligned}j=k∑iai,jbj,k=δi,k
然后带入公式,转化无符号斯特林数即可(由于和二项式的差不多,所以这里就不列式子了,如果实在不懂可以问我)
这个式子经过一些推导可以推出:
f(i)=∑j=in{ji}g(j)⇔g(i)=∑j=in(−1)j−i[ji]f(j)f(i)=\sum_{j=i}^n\begin{Bmatrix}j\\i\end{Bmatrix}g(j)\Leftrightarrow g(i)=\sum_{j=i}^n(-1)^{j-i}\begin{bmatrix}j\\i\end{bmatrix}f(j)f(i)=j=i∑n{ji}g(j)⇔g(i)=j=i∑n(−1)j−i[ji]f(j)
例题:
bzoj4671
莫比乌斯反演(数论)
这其实是数论里面的内容,可以通过狄利克雷卷积进行证明
然而,既然这是反演,那么也同样可以通过这里提供的方法进行证明
先列出莫比乌斯反演的式子
fi=∑j∣igj⇔gi=∑j∣iμijfjf_i=\sum_{j|i}g_j\Leftrightarrow g_i=\sum_{j|i}\mu_{\frac ij}f_jfi=j∣i∑gj⇔gi=j∣i∑μjifj
给出莫比乌斯函数的定义
μ(n)={1,若n=1(−1)k,若n无平方数因数且n=p1∗p2⋅⋅⋅pk0,若n有平方数因数\mu(n)=\begin{cases} 1,\ \ \ \ \ \ \ \ 若n=1 \\ (-1)^k,若n无平方数因数且n=p_1*p_2···p_k\\ 0,\ \ \ \ \ \ \ \ 若n有平方数因数 \end{cases}μ(n)=⎩⎪⎨⎪⎧1, 若n=1(−1)k,若n无平方数因数且n=p1∗p2⋅⋅⋅pk0, 若n有平方数因数
当然也可以看我的博客数论学习
然后我们来进行证明
列出a,ba,ba,b的值:ai,j=[j∣i],bi,j=[j∣i]∗μija_{i,j}=[j|i],b_{i,j}=[j|i]*\mu_{\frac ij}ai,j=[j∣i],bi,j=[j∣i]∗μji
注意:[A]={0(A为假)1(A为真)[A]=\begin{cases}0(A为假)\\1(A为真)\end{cases}[A]={0(A为假)1(A为真)
代入:
∑j=1nai,jbj,k=∑j=1n[j∣i][k∣j]∗μjk=[k∣i]∑j=1n[j∣i][k∣j]∗μjk=[k∣i]∑j=1nk[j∣ik]∗μj=[k∣i]∑j∣ikμj=[k=i]\begin{aligned} \sum_{j=1}^na_{i,j}b_{j,k}&=\sum_{j=1}^n[j|i][k|j]*\mu_{\frac jk}\\ &=[k|i]\sum_{j=1}^n[j|i][k|j]*\mu_{\frac jk}\\ &=[k|i]\sum_{j=1}^{\frac nk}[j|\frac ik]*\mu_j\\ &=[k|i]\sum_{j|\frac ik}\mu_j\\ &=[k=i] \end{aligned}j=1∑nai,jbj,k=j=1∑n[j∣i][k∣j]∗μkj=[k∣i]j=1∑n[j∣i][k∣j]∗μkj=[k∣i]j=1∑kn[j∣ki]∗μj=[k∣i]j∣ki∑μj=[k=i]
用到了一个式子∑d∣nμ(d)=[n=1]\sum_{d|n}\mu(d)=[n=1]∑d∣nμ(d)=[n=1]
其实非常显然,直接根据含义讨论其相异质因子数量,根据定义计算,用二项式定理即可(证明也可以在我的数论学习博客中找到)
然后就好了
没啥裸的例题,主要是在数论中的推公式的时候会用到
单位根反演(离散傅里叶变换中有应用)
学新的东西自然先从已经会的东西来拓展辣,贴出链接我的FFT博客
多项式乘法用到了离散傅里叶变换,它使插值的复杂度从Θ(n3)\Theta(n^3)Θ(n3)的暴力高斯消元降到和求值一样的复杂度
我们考虑插值的本质
设gig_igi为多项式的iii次项系数,设fif_ifi为将ωni\omega_n^iωni带入的点值
那么满足
fi=∑j=0n−1(ωni)jgj=∑j=0n−1ωni∗jgj\begin{aligned} f_i&=\sum_{j=0}^{n-1}(\omega_n^i)^jg_j\\ &=\sum_{j=0}^{n-1}\omega_n^{i*j}g_j \end{aligned}fi=j=0∑n−1(ωni)jgj=j=0∑n−1ωni∗jgj
现在已知fff,求ggg
一看就知道是经典的反演
离散傅里叶给出的结论是:
gi=∑j=0n−1(ωni)−jnfj=∑j=0n−1ωn−i∗jnfj\begin{aligned} g_i&=\sum_{j=0}^{n-1}\frac{(\omega_n^i)^{-j}}nf_j\\ &=\sum_{j=0}^{n-1}\frac{\omega_n^{-i*j}}nf_j \end{aligned}gi=j=0∑n−1n(ωni)−jfj=j=0∑n−1nωn−i∗jfj
然后我们来验证一下这个反演的正确性
已知ai,j=ωni∗j,bi,j=ωn−i∗jna_{i,j}=\omega_n^{i*j},b_{i,j}=\frac{\omega_n^{-i*j}}nai,j=ωni∗j,bi,j=nωn−i∗j
我们将a,ba,ba,b代入广义反演的判定式:
∑j=0n−1ai,jbj,k=∑j=0n−1ωni∗jωn−j∗kn=∑j=0n−1ωn(i−k)∗jn=δi,k\begin{aligned} \sum_{j=0}^{n-1}a_{i,j}b_{j,k}&=\sum_{j=0}^{n-1}\omega_n^{i*j}\frac{\omega_n^{-j*k}}n\\ &=\sum_{j=0}^{n-1}\frac{\omega_n^{(i-k)*j}}n\\ &=\delta_{i,k} \end{aligned}j=0∑n−1ai,jbj,k=j=0∑n−1ωni∗jnωn−j∗k=j=0∑n−1nωn(i−k)∗j=δi,k
i=ki=ki=k时每一项的值为1n\frac1nn1
i≠ki\neq ki̸=k时等比数列求和(x0+x1+⋅⋅⋅+xn−1=xn−1x−1x^0+x^1+···+x^{n-1}=\frac {x^n-1}{x-1}x0+x1+⋅⋅⋅+xn−1=x−1xn−1)
算出结果是(ωni−k)n−1n(ωni−k−1)=(ωnn)i−k−1n(ωni−k−1)=1i−k−1n(ωni−k−1)=0\frac {(\omega_n^{i-k})^n-1}{n(\omega_n^{i-k}-1)}=\frac {(\omega_n^n)^{i-k}-1}{n(\omega_n^{i-k}-1)}=\frac {1^{i-k}-1}{n(\omega_n^{i-k}-1)}=0n(ωni−k−1)(ωni−k)n−1=n(ωni−k−1)(ωnn)i−k−1=n(ωni−k−1)1i−k−1=0
然后反演的正确性得证(我怎么现在才知道这是反演啊)
另外单位根反演也有例题应用
具体形式是[n∣x]=1n∑i=0n−1(ωnx)i[n|x]=\frac1n\sum_{i=0}^{n-1}(\omega_n^x)^i[n∣x]=n1i=0∑n−1(ωnx)i
详见例题:单位根反演&[loj6485]LJJ 学二项式定理
最值反演(min-max容斥)
设现在有一个集合A,定义max{A}为集合A中最大元素的值的大小,min{A}为集合A中最小元素值的大小
那么有如下式子:
max{S}=∑T⊆S(−1)∣T∣+1min{T}max\{S\}=\sum_{T\subseteq S}(-1)^{|T|+1}min\{T\}max{S}=T⊆S∑(−1)∣T∣+1min{T}
反演一下也对
min{S}=∑T⊆S(−1)∣T∣+1max{T}min\{S\}=\sum_{T\subseteq S}(-1)^{|T|+1}max\{T\}min{S}=T⊆S∑(−1)∣T∣+1max{T}
证明?
这可能是广义的反演(这个叫它反演我认为没有什么意义,因为其本身的存在是基于fff和ggg确定的情况的)
还是写一下吧:aS,T=(−1)∣T∣+1,bS,T=(−1)∣T∣+1a_{S,T}=(-1)^{|T|+1},b_{S,T}=(-1)^{|T|+1}aS,T=(−1)∣T∣+1,bS,T=(−1)∣T∣+1
∑T⊆X⊆SaS,XbX,T=∑T⊆X⊆S(−1)∣X∣+∣T∣=δS,T\begin{aligned} \sum_{T\subseteq X\subseteq S}a_{S,X}b_{X,T}&=\sum_{T\subseteq X\subseteq S}(-1)^{|X|+|T|}\\ &=\delta_{S,T}\\ \end{aligned}T⊆X⊆S∑aS,XbX,T=T⊆X⊆S∑(−1)∣X∣+∣T∣=δS,T
非常明显吧
但是这个所谓反演其实并没有啥用,这两个式子其实重在容斥的推导
推导??
借用csdn用户DOFYPXY的一句话:min-max容斥,感觉很神奇,其实很sb
我们可以通过分析来证明这个式子(这真的算容斥吗???)
设x=max{S}x=max\{S\}x=max{S}所有集合分包含xxx和不包含xxx两种。对于每个不包含xxx的非空集合,其加入xxx后的集合的minminmin值不变,符号相反,于是相互抵消;空集由于没有元素,所以不贡献答案,其加入一个元素xxx后最小值为xxx,故贡献值为xxx
对于反演后的式子的推导同理
其本身似乎并没有什么用,但是好像可以套上期望
例题:PKUWC2018随机游走
莫比乌斯变换(FMT)
在FMT中,我们用到了一个反演的式子,来由莫比乌斯变换(FMT) 推导莫比乌斯反演(FMI)
列出式子:
f(S)=∑T⊆Sg(T)⇔g(S)=∑T⊆S(−1)∣S∣−∣T∣f(T)f(S)=\sum_{T\subseteq S}g(T)\Leftrightarrow g(S)=\sum_{T\subseteq S}(-1)^{|S|-|T|}f(T)f(S)=T⊆S∑g(T)⇔g(S)=T⊆S∑(−1)∣S∣−∣T∣f(T)
证明:aS,T=1,bS,T=(−1)∣S∣−∣T∣a_{S,T}=1,b_{S,T}=(-1)^{|S|-|T|}aS,T=1,bS,T=(−1)∣S∣−∣T∣
∑T⊆X⊆SaS,XbX,T=∑T⊆X⊆S(−1)∣X∣−∣T∣=δS,T\begin{aligned} \sum_{T\subseteq X\subseteq S}a_{S,X}b_{X,T}&=\sum_{T\subseteq X\subseteq S}(-1)^{|X|-|T|}\\ &=\delta_{S,T}\\ \end{aligned}T⊆X⊆S∑aS,XbX,T=T⊆X⊆S∑(−1)∣X∣−∣T∣=δS,T
和最值反演里的反演证明几乎一样,都很显然
容斥反演的联系
反演是一种特殊的容斥,任何反演都可以通过容斥推得
总结
反演作为一种特殊的容斥,还是会被经常用到的,活用各类反演非常重要
对于容斥原理反演的思考和总结相关推荐
- 关于广义莫比乌斯反演的思考
本文总结关于广义莫比乌斯反演的一些思想. 1. 广义莫比乌斯反演 为区别平时所说的整数上定义整除关系后,在dirichlet卷积下的莫比乌斯反演,这里更关心其一般化,所以称之为广义莫比乌斯反演. 在R ...
- 斯特林反演[bzoj4671]异或图
前言 继续学习容斥的技巧! 题意简介 题面链接 题目大意 定义两个无重边无自环图G1,G2G_1,G_2G1,G2的异或为G3G_3G3(G1,G2,G3G_1,G_2,G_3G1,G2,G ...
- 单位根反演[loj6485]LJJ 学二项式定理
前言 之前写反演的博客对于单位根反演只提了FFT 这里补一下一个应用 单位根反演 fi=∑j=0n−1ωni∗jgj⇔gi=∑j=0n−1ωn−i∗jnfjf_i=\sum_{j=0}^{n-1}\o ...
- UVALive 7040 Color
题目链接:LA-7040 题意为用m种颜色给n个格子染色.问正好使用k种颜色的方案有多少. 首先很容易想到的是\( k * (k-1)^{n-1}\),这个算出来的是使用小于等于k种颜色给n个方格染色 ...
- 莫比乌斯函数(数论)(转载+原创)
一.莫比乌斯函数(Möbius function)是指以下的函数: 在这里,λ(n)是刘维尔函数 莫比乌斯函数是一个数论函数,它同时也是一个积性函数(i.e.μ(ab) =μ(a)μ(b), a,b互 ...
- BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Submit: 4032 Solved: 1817 [Submi ...
- 《算法竞赛进阶指南》数论篇(3)-组合计数,Lucas定理,Catalan数列,容斥原理,莫比乌斯反演,概率与数学期望,博弈论之SG函数
文章目录 组合计数 例题:Counting swaps Lucas定理 Cnm≡Cnmodpmmodp∗Cn/pm/p(modp)C_n^m\equiv C_{n\ mod\ p}^{m\ mod\ ...
- (每日一题)P1447 [NOI2010] 能量采集(莫反套路 + 欧拉反演 / 容斥原理)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.19 莫反 Problem Solu ...
- hdu1695 容斥原理 莫比乌斯反演
给定两个数b,d,问[1,b]和[1,d]区间上有多少对互质的数.(x,y)和(y,x)算一个. 对于[1,b]部分,用欧拉函数直接求.对于大于b的部分,求n在[1,b]上有多少个互质的数,用容斥原理 ...
最新文章
- 如何把Office365的更新从半年通道改成月度通道
- java中使用json以及所导入的包
- numpy二维数组改变某些数_【每天15分钟,5天学会NumPy】第1天:基本概念
- CF-825 G.Tree Queries(DFS)
- Download Apache Commons BeanUtils
- win10玩cf不能全屏_游戏莫名卡顿三招搞定!Win10游戏优化教程
- 工信部证书含金量_关于推荐考取BIM工程师、装配式工程师证书
- 【恋上数据结构】MySQL的索引底层为何使用 B+树?
- windows搭建virtualbox虚拟机安装的android环境
- php代码给用户安装浏览器,PHP判断用户浏览器是否安装alexa工具条程序
- 图扑软件数字孪生 SMT 产线,智能工业可视化管理
- ad引脚名字设置_AD软件管脚名称如何放置负信号?
- 58上租房显示服务器异常,“58同城租房信息”满是套路,你中招了吗?
- 华为使用计算机投屏要打开什么,华为手机怎么投屏到电脑?这些小屏变大屏的操作你会吗...
- hibernate之HQL属性查询
- PS和AI安装后报代码为16的错误解决方法
- 2021-08-29 UML笔记
- LK(Lucas-Kanade)稀疏光流法
- 求某一年的某一月有多少天
- 【二】Html5的浏览器支持
热门文章
- SOA实现方式与模式
- 加密与安全 - Java加密与安全
- 数据拆分缺点和解决方案
- oracle与jdbc连接数据库,JDBC与Oracle数据库连接
- 创建用户赋权限_MySQL实战第84篇:MySQL数据库添加用户和赋权限,在8.0版本!
- drop 很慢 物化视图_终于解决了物化视图复制的问题
- 图片去字工具_这些免费工具轻松提取图片中的文字,别再傻傻地手工去输了
- mac自带python怎么用_怎么在mac上使用python
- 谷歌浏览器32位版本安装包_Windows 10 OEM渠道告别32位版本 这意味着什么?
- 200801一阶段1函数封装