处理线性递推的一些方法

线性递推

形如

\[F_n=\sum_{i=1}^kF_{n-i}*a_i \]

通常情况下给出\(F_{0\ldots k}\)的值。


矩阵快速幂

适用于\(k\)比较小,\(n\)非常大的情况。

复杂度\(O(k^3logn)\)

特征多项式

用于解决常系数齐次线性递推。

这个可以看做矩阵快速幂的一个优化。

证明

\(\displaystyle B(x)=x^k-\sum_{i=1}^ka_ix^{k-i}\)。现在要求\(F_n\)的值。设\(G(x)=x^n\% B(x)\),则$ \displaystyle F_n=\sum_{i=0}^kg_i*F_i$。

因为

\[x^{2*n}\equiv (x^n)^2\pmod{B(x)} \]

所以可以用类似于快速幂的方式求\(x^n\%B(x)\)

复杂度\(O(k^2logn)\)

分治FFT

可以发现,这个转移也是一个卷积式子。所以我们可以分治。处理区间\([l,r]\)的时候求出\(f_{l\ldots mid}\)\(f_{mid+1\ldots r}\)的贡献。

复杂度\(O(nlog^2n)\)

多项式求逆

\(A(x)=\sum_{i=1}^ka_ix^i\),则:

\[F=F*A+[x_0]F\\ \Rightarrow F=\frac{[x^0]F}{1-A} \]

复杂度\(O(nlogn)\)

posted @ 2019-05-31 16:18  hec0411  阅读(595)  评论(0编辑  收藏  举报