码迷,mamicode.com
首页 > 其他好文 > 详细

LG4723 【模板】常系数齐次线性递推

时间:2019-07-06 22:06:10      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:乘法   优化   art   str   amp   article   变换   数学   快速幂   

P4723 【模板】常系数齐次线性递推

题目描述

求一个满足$k$阶齐次线性递推数列${a_i}$的第$n$项。

即:$a_n=\sum\limits_{i=1}^{k}f_i \times a_{n-i}$

输入输出格式

输入格式:

第一行两个数$n$,$k$,如题面所述。

第二行$k$个数,表示$f_1 \ f_2 \ \cdots \ f_k$

第三行$k$个数,表示$a_0 \ a_1 \ \cdots \ a_{k-1}$

输出格式:

一个数,表示 $a_n \% 998244353$ 的值

输入输出样例

输入样例#1: 复制
6 4
3 -1 0 4
-2 3 1 5
输出样例#1: 复制
73

说明

$N = 10^{9} , K = 32000 $

题解

先修《数学选修4-2:矩阵与变换》。

常系数齐次线性递推

给出递推式\(f_n=\sum_{i=1}^ka_if_{n-i}\),和初值条件\(f_1,f_2,\dots ,f_k\),求\(f_n\)

可以用生成函数解一下,然后多项式求逆,\(O(n\log n)\)。当然这对于\(n=10^9\)的数据范围是不行的。

矩阵快速幂解法

由递推式,构造矩阵和列向量
\[ A=\begin{bmatrix} 0 & 1 & 0 & \dots & 0\0 & 0 & 1 & \dots & 0\0 & 0 & 0 & \dots & 0\\vdots & \vdots & \vdots & \ddots & \vdots\0 & 0 & 0 & \dots & 1\a_1 & a_2 & a_3 & \dots & a_k \end{bmatrix} ,F=\begin{bmatrix} f_1\f_2\f_3\\vdots\f_k \end{bmatrix} \]

计算\(A^{n-k}F\)即可,\(O(k^3\log n)\)。然而这对于\(k=32000\)的数据范围还是不行。

矩阵的特征值和特征向量

\(A^nF\)是线性变换的形式,自然也可以用特征值与特征向量来求解。

特征多项式是\(f_A(\lambda)=|A-\lambda I|\),于是特征方程为
\[ \det\begin{bmatrix} -\lambda & 1 & 0 & \dots & 0\0 & -\lambda & 1 & \dots & 0\\vdots & \vdots & \vdots & \ddots & \vdots\0 & 0 & 0 & \dots & 1\a_1 & a_2 & a_3 & \dots & a_k-\lambda \end{bmatrix}=0 \]
手动高斯消元,消成上三角可得
\[ (a_k-\lambda+\frac{a_{k-1}}{\lambda}+\frac{a_{k-2}}{\lambda^2}+\dots+\frac{a_1}{\lambda^{k-1}})(-\lambda)^{k-1}=0\a_1+a_2\lambda+a_3\lambda^2+\dots+a_k\lambda^{k-1}=\lambda^k \]
然后呢,把特征值解出来然后用特征向量那套理论吗?虽然这种方法可行,但是只能做低次的(4次及以下),所以我们需要新科技。

矩阵的多项式

对于\(n\)次多项式\(f(x)\),将矩阵\(A\)看做自变量带入,得
\[ f(A)=a_0E+\sum_{i=1}^na_iA^i \]
\(f(A)\)\(A\)\(n\)次多项式。与另一个\(A\)\(m\)次多项式\(g(A)\),其乘法运算满足交换律,即
\[ f(A)g(A)=g(A)f(A) \]

Cayley-Hamilton 定理

特征多项式\(f_A(x)=\sum_{i=0}^{k-1}a_{i+1}x^i-x^k\),这里注意下标。

定理:\(f_A(A)=0\),即矩阵被自己的特征多项式化零。记忆方法:\(f_A(A)=|A-AI|=0\)

推论:\(A^n=q(A)f_A(A)+r(A)=r(A)\),其中\(r(A)=A^n\mod f_A(A)\)

所以\(A^nF=r(A)F=\sum_{i=0}^{k-1}r_iA^iF\)\(O(k^4)\)。???

多项式优化

将Cayley-Hamilton定理的推论变成普通多项式:\(x^n=q(x)f_A(x)+r(x)\),其中\(r(x)=x^n\mod f_A(x)\)

于是我们可以对多项式\(x\)做快速幂并取模\(f_A(x)\),即可得出\(r(x)\)的系数,即\(r(A)\)的系数,\(O(k\log k\log n)\)

\(A^iF=\begin{bmatrix}f_{1+i} & f_{2+i} & \dots & f_{k+i}\end{bmatrix}^T\),所以\(f_{n+k}=\sum_{i=0}^{k-1}r_if_{k+i}\)

问题转化成了如何求\(f\)的前\(2k\)项。这时使用生成函数和多项式求逆,\(O(k\log k)\)

于是我们便得到了\(O(k\log k\log n+k\log k+k)\)的优秀解法。

LG4723 【模板】常系数齐次线性递推

标签:乘法   优化   art   str   amp   article   变换   数学   快速幂   

原文地址:https://www.cnblogs.com/autoint/p/11144308.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!