感谢boshi和Rayment大佬!!!您们tql!!!
假设我们手头有个函数 F F F(准确的说是数列,因为一般只有整数自变量有用),通过某种变换 H H H,可以得到函数 G G G。
可现在我的手头只有函数 G G G,得寻找一种变换 H − 1 H^{-1} H−1,使得 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)n−iCniG(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)i−kCikG(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)i−jCij, 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] (A∗B)[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)k−jCikCkj=∑k=1n(−1)k(−1)−jCijCi−ji−k
= ( − 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)−jCij∑k=0n(−1)kCi−ji−k=(−1)i−jCij∑k=0i−j(−1)kCi−jk
后面那一坨 ∑ \sum ∑只有在 i − j = 0 i-j=0 i−j=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)n−iS1(n,i)G(i)
我不证,哼
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)=T⊂S,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)=T⊂S,T̸=∅∑(−1)∣T∣+1MAX(T)
若 G ( S ) = ∑ T ⊂ S F ( T ) G(S)=\sum_{T \subset S} F(T) G(S)=∑T⊂SF(T),则有 F ( S ) = ∑ T ⊂ S ( − 1 ) ∣ S − T ∣ G ( T ) F(S)=\sum_{T \subset S} (-1)^{|S-T|}G(T) F(S)=∑T⊂S(−1)∣S−T∣G(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] ∑T⊂S(−1)∣T∣=∑i=0∣S∣(−1)iC∣S∣i=[S=0]
F ( S ) = ∑ T ⊂ S [ ∣ S ∣ − ∣ T ∣ = 0 ] F ( T ) F(S)=\sum_{T \subset S}[|S|-|T|=0]F(T) F(S)=∑T⊂S[∣S∣−∣T∣=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) =∑T⊂S∑P⊂S−T(−1)∣P∣F(T)=∑P⊂S(−1)∣P∣∑T⊂S−PF(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) =∑P⊂S(−1)∣P∣G(S−P)=∑T⊂S(−1)∣S−T∣G(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=0⌊kn⌋Cnik, 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] k1∑i=0k−1ωkin=[k∣n],可以用等比数列求和进行证明。
则 ∑ 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=0⌊kn⌋Cnik=∑i=0nCni[k∣i]
= ∑ 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(k1∑j=0k−1ω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} =k1∑i=0nCni∑j=0k−1ω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) =k1∑j=0k−1(∑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 =k1∑j=0k−1(1+ωkj)n
可以 O ( k log n ) O(k \log n) O(klogn)解决。
至于loj那道题,如果要求的不是 ∑ i = 0 n C n i [ i   m o d   k = = 0 ] \sum_{i=0}^n C_n^i[i \bmod k==0] ∑i=0nCni[imodk==0]而是 ∑ i = 0 n C n i [ i   m o d   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=0∑k−1ωkd(1+ωkj)n
就也能解决了。