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=0∑n(in)si[4∣(i−t)]
单位根反演:
= ∑ 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=0∑n(in)si41j=0∑3ω4j(i−t)=41j=0∑3ω4−jti=0∑n(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=0∑3ω4−jt(sω4j+1)n
直接算就可以了。
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=0∑∞i!xi[d∣i]
而我们要算的实际上是 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=0∑∞i!xij=0∑d−1ωij=d1j=0∑d−1i=0∑∞i!xiwij=d1j=0∑d−1eω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+p1⋯pd−1=k∑k!j=0∏d−1pj!1epjωjx=p0+p1⋯pd−1=k∑e(∑j=0d−1pjwj)x⋅k!j=0∏d−1pj!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+p1⋯pd−1=k∑n!(∑j=0d−1pjwj)n⋅k!j=0∏d−1pj!1
直接计算,复杂度 O ( k d log n ) O(k^d \log n) O(kdlogn)。
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=0∑n(in)Ai[k∣i])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=0∑k−1i=0∑n(in)Aiωij=k1j=0∑k−1(ωj⋅A+E)n
其中 E E E表示单位矩阵。
直接矩阵快速幂计算,时间复杂度为 O ( 2 3 ⋅ log n ⋅ k ) O(2^3 \cdot \log n \cdot k) O(23⋅logn⋅k)。
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=0∑L(mL)Am[k∣(t−m)]
单位根反演之后得到
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=0∑k−1ωk−tj(ω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=0∑k−1fjωk−tj
由于 − 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=0∑k−1(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)。