单位根反演练习题

loj6485 LJJ学二项式定理

首先枚举 i ( m o d 4 ) i\pmod 4 i(mod4)的余数 t t t,然后转化成对于每一个 t t t,求

∑ i = 0 n ( n i ) s i [ 4 ∣ ( i − t ) ] \sum_{i=0}^n {n\choose i}s^i [ 4\mid (i-t) ] \\ i=0n(in)si[4(it)]

单位根反演:

= ∑ i = 0 n ( n i ) s i 1 4 ∑ j = 0 3 ω 4 j ( i − t ) = 1 4 ∑ j = 0 3 ω 4 − j t ∑ i = 0 n ( n i ) s i w 4 i j = \sum_{i=0}^n {n\choose i}s^i {1\over 4}\sum_{j=0}^3 \omega_{4}^{j(i-t)} \\ = {1\over 4} \sum_{j=0}^3 \omega_{4}^{-jt} \sum_{i=0}^n {n\choose i}s^i w_4^{ij} =i=0n(in)si41j=03ω4j(it)=41j=03ω4jti=0n(in)siw4ij

最后面的那一坨东西,由二项式定理知 ( 1 + x ) n = ∑ i = 0 n ( n i ) x i (1+x)^n = \sum_{i=0}^n {n\choose i}x^i (1+x)n=i=0n(in)xi,所以:

= 1 4 ∑ j = 0 3 ω 4 − j t ( s ω 4 j + 1 ) n = {1\over 4} \sum_{j=0}^3 \omega_{4}^{-jt} (s\omega_4^j + 1)^n =41j=03ω4jt(sω4j+1)n

直接算就可以了。

Code

uoj450【集训队作业2018】复读机

考虑一个复读机复读次数的生成函数:

F ( x ) = ∑ i = 0 ∞ x i i ! [ d ∣ i ] F(x) = \sum_{i=0}^{\infty} {x^i\over i!} [d\mid i] F(x)=i=0i!xi[di]

而我们要算的实际上是 n ! ⋅ F k ( x ) [ x n ] n! \cdot F^k(x) [x^n] n!Fk(x)[xn]

F ( x ) F(x) F(x)进行单位根反演:

F ( x ) = 1 d ∑ i = 0 ∞ x i i ! ∑ j = 0 d − 1 ω i j = 1 d ∑ j = 0 d − 1 ∑ i = 0 ∞ x i w i j i ! = 1 d ∑ j = 0 d − 1 e ω j x F(x) = {1\over d}\sum_{i=0}^{\infty} {x^i\over i!} \sum_{j=0}^{d-1} \omega^{ij}\\ = {1\over d}\sum_{j=0}^{d-1} \sum_{i=0}^{\infty} {x^iw^{ij}\over i!}\\ = {1\over d} \sum_{j=0}^{d-1} e^{\omega^j x} F(x)=d1i=0i!xij=0d1ωij=d1j=0d1i=0i!xiwij=d1j=0d1eωjx

1 d 1\over d d1是常数,我们先把它忽视掉,最后再在答案里乘上一个 1 d k 1\over d^k dk1

考虑 F k ( x ) F^k(x) Fk(x)的组合意义,相当于对于这 k k k个多项式,从每一个里面选一项相乘,所有的方案得到的乘积的和。枚举 e ω j x e^{\omega^jx} eωjx被选的次数 p j p_j pj,得到
F k ( x ) = ∑ p 0 + p 1 ⋯ p d − 1 = k k ! ∏ j = 0 d − 1 1 p j ! e p j ω j x = ∑ p 0 + p 1 ⋯ p d − 1 = k e ( ∑ j = 0 d − 1 p j w j ) x ⋅ k ! ∏ j = 0 d − 1 1 p j ! F^k (x) = \sum_{p_0+p_1\cdots p_{d-1}=k}k!\prod_{j=0}^{d-1} {1\over p_j!}e^{p_j \omega_jx}\\ = \sum_{p_0+p_1\cdots p_{d-1}=k} e^{(\sum_{j=0}^{d-1}p_jw_j)x} \cdot k!\prod_{j=0}^{d-1} {1\over p_j!} Fk(x)=p0+p1pd1=kk!j=0d1pj!1epjωjx=p0+p1pd1=ke(j=0d1pjwj)xk!j=0d1pj!1

F k ( x ) [ x n ] = ∑ p 0 + p 1 ⋯ p d − 1 = k ( ∑ j = 0 d − 1 p j w j ) n n ! ⋅ k ! ∏ j = 0 d − 1 1 p j ! F^k (x) [ x^n ] = \sum_{p_0+p_1\cdots p_{d-1}=k} {(\sum_{j=0}^{d-1}p_jw_j)^n \over n!} \cdot k!\prod_{j=0}^{d-1} {1\over p_j!} Fk(x)[xn]=p0+p1pd1=kn!(j=0d1pjwj)nk!j=0d1pj!1

直接计算,复杂度 O ( k d log ⁡ n ) O(k^d \log n) O(kdlogn)

Code

bzoj3328 PYXFIB


A = [ 1 0 1 1 ] B = [ 1 1 ] A = \begin{bmatrix}1 & 0 \\ 1 & 1\end{bmatrix}\\ B = \begin{bmatrix} 1 \\ 1 \end{bmatrix} A=[1101]B=[11]

则我们相当于要求出

( ∑ i = 0 n ( n i ) A i [ k ∣ i ] ) B (\sum_{i=0}^n {n\choose i} A^i [k\mid i] )B (i=0n(in)Ai[ki])B

对前面的那个括号里面的东西单位根反演,得到

1 k ∑ j = 0 k − 1 ∑ i = 0 n ( n i ) A i ω i j = 1 k ∑ j = 0 k − 1 ( ω j ⋅ A + E ) n {1\over k} \sum_{j=0}^{k-1} \sum_{i=0}^n {n\choose i}A^i\omega^{ij} \\ = {1\over k} \sum_{j=0}^{k-1} (\omega^j\cdot A + E)^n k1j=0k1i=0n(in)Aiωij=k1j=0k1(ωjA+E)n

其中 E E E表示单位矩阵。

直接矩阵快速幂计算,时间复杂度为 O ( 2 3 ⋅ log ⁡ n ⋅ k ) O(2^3 \cdot \log n \cdot k) O(23lognk)

loj3058 「HNOI2019」白兔之舞

设矩阵 A A A是满足 A i , j = w ( i , j ) A_{i,j} = w(i,j) Ai,j=w(i,j) n × n n\times n n×n的矩阵。

m m m步的方案数为 ( L m ) T x , y {L\choose m}T_{x,y} (mL)Tx,y,其中 T = A m T=A^m T=Am

则对于每一个 t t t,我们需要求出

∑ m = 0 L ( L m ) A m [ k ∣ ( t − m ) ] \sum_{m=0}^L {L\choose m}A^m [k\mid (t-m)] m=0L(mL)Am[k(tm)]

单位根反演之后得到

1 k ∑ j = 0 k − 1 ω k − t j ( ω k j A + E ) L {1\over k}\sum_{j=0}^{k-1} \omega_k^{-tj}(\omega_k^jA + E)^L k1j=0k1ωktj(ωkjA+E)L

对于每一个 j j j,分别算出 F j = ( ω k j A + E ) L F_j = (\omega_k^j A+ E)^L Fj=(ωkjA+E)L,设 f j f_j fj F j F_j Fj x x x y y y列的元素,则 t t t的答案就是

A n s t = 1 k ∑ j = 0 k − 1 f j ω k − t j Ans_t = {1\over k}\sum_{j=0}^{k-1} f_j \omega_k^{-tj} Anst=k1j=0k1fjωktj

由于 − t j = ( t 2 ) + ( j 2 ) − ( t + j 2 ) -tj={t\choose 2}+{j\choose 2}-{t+j\choose 2} tj=(2t)+(2j)(2t+j),所以

A n s t = 1 k ⋅ ω k ( t 2 ) ∑ j = 0 k − 1 ( f j ⋅ ω k ( j 2 ) ) ω k − ( i + j 2 ) Ans_t = {1\over k}\cdot \omega_k^{t\choose 2} \sum_{j=0}^{k-1} (f_j\cdot \omega_k^{j\choose 2} ) \omega_k^{-{i+j\choose 2}} Anst=k1ωk(2t)j=0k1(fjωk(2j))ωk(2i+j)

这是一个卷积的形式,用MTT优化一下就可以了。

总时间复杂度 O ( k n 3 log ⁡ L + k log ⁡ k ) O(kn^3\log L + k\log k) O(kn3logL+klogk)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值