TIP:这篇文章只是快速入门,并不包含更加详细的内容
Description
求以下递推式第n项:
f
i
=
∑
j
=
1
m
c
j
f
i
−
j
f_i=\sum_{j=1}^mc_jf_{i-j}
fi=j=1∑mcjfi−j
其中
c
j
c_j
cj为常数,
形如这样的式子叫做:常系数齐次线性递推,
接下来我们将讨论,当m较小,n很大时,如何快速求出答案
前置技能
先介绍一些必要的东西:
若对于m阶矩阵
A
A
A,有常数
λ
\lambda
λ,非零列向量
v
→
\overrightarrow{v}
v ,满足:
λ
v
→
=
v
→
A
\lambda \overrightarrow{v}=\overrightarrow{v} A
λv=vA
那么我们就称:
λ
\lambda
λ为矩阵特征值,
v
→
\overrightarrow{v}
v为矩阵特征列向量,
移项得:
(
λ
I
−
A
)
v
→
=
0
(\lambda I-A)\overrightarrow{v}=0
(λI−A)v=0
也写作:
(
λ
I
−
A
)
=
0
(\lambda I-A)=0
(λI−A)=0
也就是说,
(
λ
I
−
A
)
(\lambda I-A)
(λI−A)的行列式均为0,即
∣
λ
I
−
A
∣
=
0
|\lambda I-A|=0
∣λI−A∣=0,
我们可以将
∣
λ
I
−
A
∣
|\lambda I-A|
∣λI−A∣看做是关于
λ
\lambda
λ的一个m次多项式,记作
f
(
λ
)
f(\lambda)
f(λ),叫做A的特征多项式,
对于矩阵
A
A
A的任意特征值
λ
0
\lambda_0
λ0,都有
f
(
λ
0
)
=
0
f(\lambda_0)=0
f(λ0)=0,
顺便也定义一下矩阵多项式(即把普通多项式
f
(
x
)
f(x)
f(x)的
x
x
x换成一个矩阵),
这个和向量差不多,加法就直接按位相加,常乘法就直接乘,乘法就矩阵乘法,
哈密顿—凯莱定理:对于矩阵A的特征多项式 f ( x ) f(x) f(x),满足 f ( A ) = 0 f(A)=0 f(A)=0
Solution
先把原始转成矩阵乘法的形式,
对于转移矩阵C,我们考虑求它的特征多项式:
C大概是长这样的
(1)
λ
I
−
C
=
(
λ
−
c
1
−
c
2
⋯
−
c
m
−
1
−
c
m
−
1
λ
⋯
0
0
0
−
1
⋯
0
0
⋮
⋮
⋱
⋮
⋮
0
0
⋯
−
1
λ
)
\lambda I-C= \left( { \begin{matrix} \lambda-c_1 & -c_2 & \cdots &-c_{m-1} & -c_m \\ -1 & \lambda & \cdots & 0 &0 \\ 0 & -1 &\cdots & 0 & 0\\ \vdots & \vdots & \ddots & \vdots &\vdots \\ 0 & 0 & \cdots & -1 & \lambda \end{matrix} \tag{1} } \right)
λI−C=⎝⎜⎜⎜⎜⎜⎛λ−c1−10⋮0−c2λ−1⋮0⋯⋯⋯⋱⋯−cm−100⋮−1−cm00⋮λ⎠⎟⎟⎟⎟⎟⎞(1)
把第一行提出来,可以发现剩下的这个东西的特征多项式(行列式)比较好求,即:
f
(
λ
)
=
λ
m
−
∑
i
=
1
m
c
i
λ
m
−
i
f(\lambda)= \lambda^{m}-\sum_{i=1}^mc_i \lambda^{m-i}
f(λ)=λm−i=1∑mciλm−i
(本来要乘
(
−
1
)
i
−
1
(-1)^{i-1}
(−1)i−1的但被逆序对贡献的-1消掉了)
现在我们的目标是求 C n − 1 C^{n-1} Cn−1,求出这个东西以后就直接乘上初始矩阵即可,
我们把
C
n
−
1
C^{n-1}
Cn−1看做是一个关于矩阵C的(n-1)次项多项式(只是只有一项罢了),
显然的,
C
n
−
1
C^{n-1}
Cn−1可以写成
P
(
C
)
f
(
C
)
+
R
(
C
)
P(C)f(C)+R(C)
P(C)f(C)+R(C)的形式,其中
R
(
C
)
=
C
n
−
1
m
o
d
  
f
(
C
)
R(C)=C^{n-1}\mod{f(C)}
R(C)=Cn−1modf(C)
又已知
f
(
C
)
=
0
f(C)=0
f(C)=0,所以只用求
R
(
C
)
R(C)
R(C)即可,
我们可以把矩阵C先看成普通的实数x,即先求出
R
(
x
)
=
x
n
−
1
m
o
d
  
f
(
x
)
R(x)=x^{n-1}\mod{f(x)}
R(x)=xn−1modf(x)中的
R
(
x
)
R(x)
R(x)的系数,最后再考虑矩阵C,
关于
R
(
x
)
R(x)
R(x)怎么求,我们可以考虑使用快速幂+多项式取模解决,
复杂度:
O
(
m
log
(
n
)
log
(
n
)
)
O(m\log(n)\log(n))
O(mlog(n)log(n))
设矩阵
G
G
G表示一开始递推式的前m项,
g
i
g_i
gi表示第i项
设多项式
R
(
x
)
=
∑
i
=
0
m
−
1
d
i
x
i
R(x)=\sum_{i=0}^{m-1}d_ix^i
R(x)=∑i=0m−1dixi
好了我们现在求出了
R
(
x
)
R(x)
R(x),现在我们要求的是
R
(
C
)
∗
G
R(C)*G
R(C)∗G,将其展开:
∑
i
=
0
m
−
1
d
i
∗
(
C
i
∗
G
)
\sum_{i=0}^{m-1}d_i*(C^i*G)
i=0∑m−1di∗(Ci∗G)
答案就是这东西算出来的矩阵的第一项,
可以发现
C
i
∗
G
C^i*G
Ci∗G这个矩阵的第一项就是
g
i
+
1
g_{i+1}
gi+1,也就是说:
A
n
s
=
∑
i
=
0
m
−
1
d
i
∗
g
i
+
1
Ans=\sum_{i=0}^{m-1}d_i*g_{i+1}
Ans=i=0∑m−1di∗gi+1
Extra
关于递推的前m项怎么算,这个可以用生成函数解决,
我们可以把序列写成多项式
g
(
x
)
g(x)
g(x),转移也写成多项式形式
c
(
x
)
c(x)
c(x)
这个多项式具有无限多项,满足:
g
(
x
)
=
g
(
x
)
∗
c
(
x
)
+
r
g(x)=g(x)*c(x)+r
g(x)=g(x)∗c(x)+r
其中r为第一项,
移项得:
g
(
x
)
=
r
1
−
c
(
x
)
g(x)=\frac{r}{1-c(x)}
g(x)=1−c(x)r
这东西多项式求逆元即可,
这同时启示我们只要存在形如这样的式子即可以用这种方法解决,