处理线性递推的一些方法

线性递推

形如
\[ 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)\)

转载于:https://www.cnblogs.com/hchhch233/p/10955854.html

你可能感兴趣的:(处理线性递推的一些方法)