关于反演的一些归纳总结

感谢boshi和Rayment大佬!!!您们tql!!!

什么是反演?

假设我们手头有个函数 F F F(准确的说是数列,因为一般只有整数自变量有用),通过某种变换 H H H,可以得到函数 G G G

可现在我的手头只有函数 G G G,得寻找一种变换 H − 1 H^{-1} H1,使得 G G G在做过这种变换之后能够获得 F F F,这个过程就称之为反演。

莫比乌斯反演

在litble还是个傻逼的年代 (虽然现在也是个傻逼),曾经写过一篇讲莫比乌斯反演的博客->这儿,所以就懒得再讲一遍了。

二项式反演

形式1:若有 G ( n ) = ∑ i = 0 n C n i F ( i ) G(n)=\sum_{i=0}^n C_n^i F(i) G(n)=i=0nCniF(i),则有 F ( n ) = ∑ i = 0 n ( − 1 ) n − i C n i G ( i ) F(n)=\sum_{i=0}^n(-1)^{n-i}C_n^iG(i) F(n)=i=0n(1)niCniG(i)

形式2:若有 G ( k ) = ∑ i = k n C i k F ( i ) G(k)=\sum_{i=k}^n C_i^kF(i) G(k)=i=knCikF(i),则有 F ( k ) = ∑ i = k n ( − 1 ) i − k C i k G ( i ) F(k)=\sum_{i=k}^n (-1)^{i-k} C_i^k G(i) F(k)=i=kn(1)ikCikG(i)

形式3:若有 G ( n ) = ∑ i = 0 n ( − 1 ) i C n i F ( i ) G(n)=\sum_{i=0}^n (-1)^i C_n^iF(i) G(n)=i=0n(1)iCniF(i),则有 F ( n ) = ∑ i = 0 n ( − 1 ) i C n i G ( i ) F(n)=\sum_{i=0}^n (-1)^i C_n^iG(i) F(n)=i=0n(1)iCniG(i)

二项式反演本质上是向量 F F F,向量 G G G与一个矩阵之间的关系。

以形式1为例,设矩阵 A [ i ] [ j ] = C i j A[i][j]=C_i^j A[i][j]=Cij B [ i ] [ j ] = ( − 1 ) i − j C i j B[i][j]=(-1)^{i-j}C_i^j B[i][j]=(1)ijCij F F F G G G均为列向量。

则有 A F = B , B G = A AF=B,BG=A AF=B,BG=A,则有 A B = E AB=E AB=E E E E为单位矩阵)

所以我们只要证明形式1的 A B = E AB=E AB=E就行了。

( A ∗ B ) [ i ] [ j ] = ∑ k = 0 n A [ i ] [ k ] B [ k ] [ j ] (A*B)[i][j]=\sum_{k=0}^n A[i][k]B[k][j] (AB)[i][j]=k=0nA[i][k]B[k][j]

= ∑ k = 0 n ( − 1 ) k − j C i k C k j = ∑ k = 1 n ( − 1 ) k ( − 1 ) − j C i j C i − j i − k =\sum_{k=0}^n (-1)^{k-j}C_i^kC_k^j=\sum_{k=1}^n (-1)^k(-1)^{-j} C_i^j C_{i-j}^{i-k} =k=0n(1)kjCikCkj=k=1n(1)k(1)jCijCijik

= ( − 1 ) − j C i j ∑ k = 0 n ( − 1 ) k C i − j i − k = ( − 1 ) i − j C i j ∑ k = 0 i − j ( − 1 ) k C i − j k =(-1)^{-j}C_i^j\sum_{k=0}^n(-1)^kC_{i-j}^{i-k}=(-1)^{i-j}C_i^j\sum_{k=0}^{i-j}(-1)^kC_{i-j}^k =(1)jCijk=0n(1)kCijik=(1)ijCijk=0ij(1)kCijk

后面那一坨 ∑ \sum 只有在 i − j = 0 i-j=0 ij=0时才会为1,否则为0,而 i = j i=j i=j时整个式子的值为1,得证。

斯特林反演

关于斯特林数,我在还是个傻逼的年代写过这样一篇文章->这里

S 1 ( n , k ) S_1(n,k) S1(n,k)为第一类斯特林数, S 2 ( n , k ) S_2(n,k) S2(n,k)为第二类斯特林树。

若有 G ( n ) = ∑ i = 1 n S 2 ( n , i ) F ( i ) G(n)=\sum_{i=1}^n S_2(n,i)F(i) G(n)=i=1nS2(n,i)F(i),则有 F ( n ) = ∑ i = 1 n ( − 1 ) n − i S 1 ( n , i ) G ( i ) F(n)=\sum_{i=1}^n (-1)^{n-i}S_1(n,i)G(i) F(n)=i=1n(1)niS1(n,i)G(i)

我不证,哼

最值反演(MAX-MIN容斥)

M A X ( S ) = ∑ T ⊂ S , T ̸ = ∅ ( − 1 ) ∣ T ∣ + 1 M I N ( T ) MAX(S)=\sum_{T \subset S,T \not= \emptyset} (-1)^{|T|+1} MIN(T) MAX(S)=TS,T̸=(1)T+1MIN(T)

M I N ( S ) = ∑ T ⊂ S , T ̸ = ∅ ( − 1 ) ∣ T ∣ + 1 M A X ( T ) MIN(S)=\sum_{T \subset S,T \not= \emptyset} (-1)^{|T|+1} MAX(T) MIN(S)=TS,T̸=(1)T+1MAX(T)

子集反演

G ( S ) = ∑ T ⊂ S F ( T ) G(S)=\sum_{T \subset S} F(T) G(S)=TSF(T),则有 F ( S ) = ∑ T ⊂ S ( − 1 ) ∣ S − T ∣ G ( T ) F(S)=\sum_{T \subset S} (-1)^{|S-T|}G(T) F(S)=TS(1)STG(T)

证明就是:

根据组合数的那一套理论, ∑ T ⊂ S ( − 1 ) ∣ T ∣ = ∑ i = 0 ∣ S ∣ ( − 1 ) i C ∣ S ∣ i = [ S = 0 ] \sum_{T \subset S} (-1)^{|T|}=\sum_{i=0}^{|S|}(-1)^iC_{|S|}^i=[S=0] TS(1)T=i=0S(1)iCSi=[S=0]

F ( S ) = ∑ T ⊂ S [ ∣ S ∣ − ∣ T ∣ = 0 ] F ( T ) F(S)=\sum_{T \subset S}[|S|-|T|=0]F(T) F(S)=TS[ST=0]F(T)
= ∑ T ⊂ S ∑ P ⊂ S − T ( − 1 ) ∣ P ∣ F ( T ) = ∑ P ⊂ S ( − 1 ) ∣ P ∣ ∑ T ⊂ S − P F ( T ) =\sum_{T \subset S}\sum_{P \subset S-T}(-1)^{|P|}F(T)=\sum_{P \subset S}(-1)^{|P|}\sum_{T \subset S-P}F(T) =TSPST(1)PF(T)=PS(1)PTSPF(T)
= ∑ P ⊂ S ( − 1 ) ∣ P ∣ G ( S − P ) = ∑ T ⊂ S ( − 1 ) ∣ S − T ∣ G ( T ) =\sum_{P \subset S}(-1)^{|P|}G(S-P)=\sum_{T \subset S}(-1)^{|S-T|}G(T) =PS(1)PG(SP)=TS(1)STG(T)

可以用高维前缀和和FWT实现,下面给出高维前缀和代码。

for(RI zt=0;zt<bin[m];++zt) F[zt]=G[zt];//bin[i]:2的i次方
	for(RI i=0;i<m;++i)
		for(RI zt=0;zt<bin[m];++zt)
			if(zt&bin[i]) F[zt]-=F[zt^bin[i]];

单位根反演

问题:求 ∑ i = 0 ⌊ n k ⌋ C n i k \sum_{i=0}^{\lfloor \frac{n}{k} \rfloor} C_n^{ik} i=0knCnik n n n非常大, k k k非常小。

例题:loj6485

引理: 1 k ∑ i = 0 k − 1 ω k i n = [ k ∣ n ] \frac{1}{k}\sum_{i=0}^{k-1} \omega_k^{in}=[k|n] k1i=0k1ωkin=[kn],可以用等比数列求和进行证明。

∑ i = 0 ⌊ n k ⌋ C n i k = ∑ i = 0 n C n i [ k ∣ i ] \sum_{i=0}^{\lfloor \frac{n}{k} \rfloor} C_n^{ik}=\sum_{i=0}^n C_n^i[k|i] i=0knCnik=i=0nCni[ki]

= ∑ i = 0 n C n i ( 1 k ∑ j = 0 k − 1 ω k i j ) =\sum_{i=0}^n C_n^i (\frac{1}{k}\sum_{j=0}^{k-1} \omega_k^{ij}) =i=0nCni(k1j=0k1ωkij)

= 1 k ∑ i = 0 n C n i ∑ j = 0 k − 1 ω k i j =\frac{1}{k}\sum_{i=0}^n C_n^i \sum_{j=0}^{k-1} \omega_k^{ij} =k1i=0nCnij=0k1ωkij

= 1 k ∑ j = 0 k − 1 ( ∑ i = 0 n C n i ( ω k j ) i ) =\frac{1}{k}\sum_{j=0}^{k-1} (\sum_{i=0}^n C_n^i (\omega_k^j)^i) =k1j=0k1(i=0nCni(ωkj)i)

= 1 k ∑ j = 0 k − 1 ( 1 + ω k j ) n =\frac{1}{k} \sum_{j=0}^{k-1} (1+\omega_k^j)^n =k1j=0k1(1+ωkj)n

可以 O ( k log ⁡ n ) O(k \log n) O(klogn)解决。

至于loj那道题,如果要求的不是 ∑ i = 0 n C n i [ i &VeryThinSpace; m o d &VeryThinSpace; k = = 0 ] \sum_{i=0}^n C_n^i[i \bmod k==0] i=0nCni[imodk==0]而是 ∑ i = 0 n C n i [ i &VeryThinSpace; m o d &VeryThinSpace; k = = d ] \sum_{i=0}^n C_n^i[i \bmod k==d] i=0nCni[imodk==d],最后要求的是

1 k ∑ j = 0 k − 1 ( 1 + ω k j ) n ω k d \frac{1}{k} \sum_{j=0}^{k-1} \frac{(1+\omega_k^j)^n}{\omega_k^d} k1j=0k1ωkd(1+ωkj)n

就也能解决了。

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值