常系数线性递推
给定向量 \(A_0 = (a_1, a_2, \dotsc, a_k)\), 和向量 \(H = (h_1, h_2, \dotsc, h_k)\), 同时
\[ a_n = \sum_{i=1}^k a_{n-i} h_i \]
求 \(a_n\).
算法
我们只需求出 \(A_n = (a_n, a_{n+1}, \dotsc, a_{n+k-1})\) 即可.
设 \(f(\lambda)\) 表示转移方程的特征多项式, 有
\[ f(\lambda) = \lambda^k - \sum_{i=0}^{k-1} h_{k-i} \lambda^i \]
设 \(g(\lambda) \equiv \lambda^{n-1} \pmod{f(\lambda)}\), 那么有
\[ a_n = \sum_{i=0}^{k-1} g_i a_{i+1} \]
求 \(g(\lambda)\) 如果直接取模则复杂度为 \(O(k^2\log n)\), 多项式取模则为 \(O(k\log k \log n)\).
代码
bzoj4161: Shlw loves matrixI
#include #include #include #include #include #include #include