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

【概述】

线性递推关系是组合计数中一种常见的递推关系,关系式为: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) 这种显然成立的式子,于是有:

线性代数 —— 线性递推关系_第1张图片

根据矩阵乘法的定义,即有: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)(斐波那契矩阵构造+费马小定理):点击这里

你可能感兴趣的:(#,线性代数——线性递推关系)