线性代数 —— 线性递推关系

【概述】

线性递推关系是组合计数中一种常见的递推关系,关系式为:F(n)=a_1F(n-1)+a_2F(n-2)+...+a_dF(n-d)

最著名的线性递推关系就是 Fibonacci 数列,有:f(1)=f(2)=1,f(n)=f(n-1)+f(n-2)

对于线性递推关系,直接利用递推式,需要在 O(nd) 的时间内才能求出 F(n),时间无法承受,可以考虑借助矩阵来进行优化。

现在已经有了:f(n)=a_1f(n-1)+a_2f(n-2)+...+a_df(n-d),那么再加上 f(n-1)=f(n-1) 这种显然成立的式子,于是有:

F_n=A*F_{n-1},F_{n-1}=\begin{bmatrix}f(n-d) \\ ... \\ f(n-1) \end{bmatrix},A=\begin{bmatrix}1 \\ &1 \\ &&1 \\&&&...& \\...&&&&1 \\ a_d&a_{d-1}&a_{d-2}&...&a_1 \end{bmatrix}

根据矩阵乘法的定义,即有:F(n)=A^{n-d}F(d),于是可以利用矩阵快速幂来解决,时间复杂度仅为 O(d^3 logn)

例如,对于递推公式:f[n] = f[n-1]+ f[n-2] * 2+1

可以构造矩阵:\begin{bmatrix}f(n) \\ f(n-1) \\ 1 \end{bmatrix}= \begin{bmatrix} 1 &2 &1 \\ 1&0 &0 \\ 0 &0 &1 \end{bmatrix} \begin{bmatrix}f(n-1) \\ f(n-2) \\ 1 \end{bmatrix}

化简后:\begin{bmatrix}f(n) \\ f(n-1) \\ 1 \end{bmatrix}= \begin{bmatrix} 1 &2 &1 \\ 1&0 &0 \\ 0 &0 &1 \end{bmatrix}^{n-1} \begin{bmatrix}f(1) \\ f(0) \\ 1 \end{bmatrix}

由于 f(0)=0,f(1)=1,那么有:\begin{bmatrix}f(n) \\ f(n-1) \\ 1 \end{bmatrix}= \begin{bmatrix} 1 &2 &1 \\ 1&0 &0 \\ 0 &0 &1 \end{bmatrix}^{n-1} \begin{bmatrix}1 \\ 0 \\ 1 \end{bmatrix}

故答案为:f(n)=A[1][1]*1+A[1][2]*0+A[1][3]*1=A[1][1]+A[1][3]

因此矩阵快速幂求出 A 后即得答案

关于矩阵快速幂:点击这里

【例题】

  1. Reading comprehension(HDU-4990):点击这里
  2. 233 Matrix(HDU-5051):点击这里
  3. Jzzhu and Sequences(CF-450B):点击这里
  4. Bear in the Field(CF-385E):点击这里
  5. M斐波那契数列(HDU-4549)(斐波那契矩阵构造+费马小定理)点击这里
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值