处理线性递推的一些方法
线性递推
形如
\[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)\)