反演
什么是反演
对于已知Fi=∑ai,j⋅Gj
反演得到Gi=∑bi,j⋅Fj
NTT,FFT,FWT的逆卷积都可以认为是一种反演
子集反演
即反解高位前缀和
常见我们写成代码是
1 2 3 4 5
| void FWT(int n,int *a,int f){ for(int i=1;i<n;i<<=1) for(int j=1;j<n;++j) if(j&i) a[j]+=a[j^i]*f; }
|
FS=∑T⊂SGT
则GS=∑T⊂S(−1)|T⊕S|FS
证明
GS=∑T⊂S(−1)|T⊕S|FS
⇔GS=∑T⊂S(−1)|T⊕S|∑R⊂TFR
⇔GS=∑T⊂SGR∑T⊂R,R⊂S(−1)|S⊕R|
⇔GS=∑T⊂SGR∑R⊂(S⊕T)(−1)|R|
⇔∑T⊂SGT[S⊕T=\empty]
成立
莫比乌斯反演
设n的质因数分解为n=Πm1pcii
前置知识:莫比乌斯系数
μ(n)=⎧⎨⎩1n=1(−1)mci=10∃ci>1
性质:∑i|nμ(i)=[n=1]
证明:
∵ci>1⇒μ(n)=0
∴ci∈{0,1}
∴∑i|nμ(i)=∑S∈{pi}(−1)|S|=[m=0]
若Fi=∑j|iGi
则Gi=∑j|iμ(ij)F(j)
证明
Gi=∑j|iμ(ij)F(j)
⇔Gi=∑j|iμ(ij)∑k|jGk
⇔Gi=∑j|iGj∑k|ijμ(k)
带入上面的μ(n)性质,这个式子成立
二项式反演
前置知识 ∑n0C(n,i)=[n=0]
Gi=∑i0C(i,j)⋅Fj
直接容斥这个式子,就能得到
Fi=Gi−∑j<iC(i,j)⋅Fj
但是容斥过程是n2的,如果n较大,用分治NTT实现也是nlog2n
所以需要二项式反演
反演:Gi=∑i0C(i,j)⋅Fj⇔Fi=∑i0(−1)i−j⋅C(i,j)⋅Gj
有时候看到是Gi=∑niC(j,i)⋅Fj⇔Fi=∑ni(−1)i−j⋅C(j,i)⋅Gj
证明
Fi=∑ni(−1)i−j⋅C(j,i)⋅Gj
⇔Fi=∑ni(−1)i−j⋅C(i,j)∑njC(j,k)⋅Fk
⇔Fi=∑i0Fj∑ijC(i,k)⋅C(k,j)⋅(−1)i−k
⇔∑ijC(i,k)⋅C(k,j)⋅(−1)i−k=[i=j]
∵C(i,k)⋅C(k,j)=i!j!(i−k)!(k−j)!
=i!j!(i−j)!⋅(i−j)!(i−k)!(k−j)!=C(i,j)⋅C(i−j,i−k)
∑ijC(i,k)⋅C(k,j)⋅(−1)i−k=C(i,j)∑i−j0(−1)kC(i−j,k)=[i=j]C(i,j)=[i=j]
待补。。。