1 条题解
-
0
问题分析
我们有一个 阶线性递推: $ h_n = a_1 h_{n-1} + a_2 h_{n-2} + \dots + a_k h_{n-k}, \quad n \ge k $ 已知 以及系数 ,要求 ,其中 可以大到 ,。
解法1:矩阵快速幂(常规方法)
构造转移矩阵
令向量 $ \mathbf{v}_m = \begin{bmatrix} h_m & h_{m+1} & \dots & h_{m+k-1} \end{bmatrix}^T $ 则递推关系可以写成: 其中 是 矩阵: $ M = \begin{bmatrix} 0 & 1 & 0 & \dots & 0 \\ 0 & 0 & 1 & \dots & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & 0 & \dots & 1 \\ a_k & a_{k-1} & \dots & a_2 & a_1 \end{bmatrix} $ 最后一行是 。
那么: 我们要的是 的第一个分量 。
复杂度
- 矩阵乘法
- 快速幂
- 总复杂度
对于 , 太大,不可行。
解法2:多项式乘法与快速幂()
理论基础
线性递推对应特征多项式: $ P(x) = x^k - a_1 x^{k-1} - a_2 x^{k-2} - \dots - a_k $ 根据 Cayley–Hamilton 定理,,所以 可以表示为 的线性组合。
计算 ,得到: $ x^n \equiv c_0 + c_1 x + \dots + c_{k-1} x^{k-1} \pmod{P(x)} $ 那么:
算法步骤
- 计算多项式 ,其中
- 设
- 则
多项式取模快速幂
- 多项式乘法用直接卷积,因为 不大
- 每次乘法
- 快速幂 次乘法
- 总复杂度
对于 ,,可行。
样例验证
输入:
n=6, k=4 a = [3, -1, 0, 4] h = [-2, 3, 1, 5]递推式: $ h_n = 3 h_{n-1} - h_{n-2} + 0\cdot h_{n-3} + 4 h_{n-4} $
计算:
- $h_4 = 3h_3 - h_2 + 4h_0 = 3\times 5 - 1 + 4\times (-2) = 15 - 1 - 8 = 6$
输出:
73
算法实现细节
多项式乘法取模
设 ,,计算 :
- 先计算完整乘积 ,次数最多
- 从高次到低次消去:对于 , 贡献到 加上 的对应项(具体根据 形式)
实际上 ,所以: [ x^k \equiv a_1 x^{k-1} + a_2 x^{k-2} + \dots + a_k \pmod{P(x)} ] 用这个关系降次。
复杂度分析
- 多项式乘法取模:
- 快速幂: 次乘法
- 总时间复杂度:
- 空间复杂度:
对于 , 运算量,可以在 2 秒内完成。
总结
这道题是线性递推快速计算的经典问题,通过多项式取模快速幂将矩阵快速幂的 优化到 ,是处理大规模线性递推的必备技巧。
- 1
信息
- ID
- 3994
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者