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

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)\)的优秀解法。

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

时间: 2024-10-09 13:35:50

LG4723 【模板】常系数齐次线性递推的相关文章

「常系数齐次线性递推」——矩阵快速幂的优化

引入: 对于递推方程: $$F(x) = \sum_{i=1}^k a_iF(x-i)$$ 我们显然会得到一个关于$F$的多项式求逆或者矩阵递推式,大多数情况下我们都是用后者,但是当$k$很大的时候,$k^3log n$的时间复杂度我们是吃不消的,那么自然我们的前人就搞出了一些优化. 特征多项式及Cayley-Hamilton定理: 一.特征多项式的定义: 设$A$是$n$阶矩阵,若数$\lambda$和非零列向量$x$使关系式$$Ax=\lambda x\;\;\;\;\;(1)$$ 成立,那

常系数齐次线性递推

常系数齐次线性递推 给定递推式\(f_n =a_1f_{n-1} + a_2 f_{n-2}...+a_k f_{n-k}\). 给定\(f_0,f_1...f_k\),求\(f_n\). 先定义\(f_n\)的特征方程:\(C(x) = x^{k-1} - a_1 x^{k-2} - a_2 x^{k-3}...-a_{k-1}x - a_k\). 求齐次线性递推通项式 由基本代数定理,\(C(x) = 0\) 的解(称为特征根)有\(K\)个,设为\(\alpha_1\).\(\alpha_

常系数齐次线性递推初探

常系数齐次线性递推式第n项的快速计算初探 XJB学后的XBJ胡扯 要做啥? 求\(f[n]=\sum_{i=1}^ka[i]f[n-i]\),\(a,f[1\to k]\)已经给出. 我会矩阵快速幂! 时间复杂度\(O(k^3\log n)\),其中\(n\le 10^9,k\le32000\),emmm. 我不会魔法! 设初始状态矩阵为\(S\),转移矩阵为\(A?\),不难发现一步转移长得像这个样子(四阶情形) \[ \begin{bmatrix} f[n]\f[n-1]\f[n-2]\f[

常系数齐次线性微分方程

二阶 变系数 齐次 线性微分方程:y''+P(x)y'+Q(x)y=0  _齐次就是右边等于0,P(x),Q(x)不是常数. 二阶 常系数 齐次 线性微分方程  y''+py'+qy=0  _其中p,q是常数. 假如y1,y2是y''+py'+qy=0 的解,那么通解的形式就是 C1y1+C2y2 = y 由于假如y=erx  y'=rerx  y''=r2erx 代入y''+py'+qy= r2erx + prerx + qerx = erx(r2+pr+q) = 0 所以 r2+pr+q=0

[HDOJ2604]Queuing(递推,矩阵快速幂)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2604 递推式是百度的,主要是练习一下如何使用矩阵快速幂优化. 递推式:f(n)=f(n-1)+f(n-3)+f(n-4),其中f(0)=2, f(1)=4, f(2)=6, f(3)=9. 当n>4时候,需要通过这个关系来递推. 构造矩阵这种东西我以前一直认为是很玄学的,但是如果深入研究的话不难发现其实也有规律可循.这是一个齐次递推式,很好构造. 我们希望通过如下矩阵(1)得到矩阵(2) | f(n

[普通递推数列] 转自《信息学奥赛之数学一本通》

[普通递推数列] 问题描述 给出一个k阶齐次递推数列f[i]的通项公式 \[ f[i] = \prod_{j = 1}^k a_jf_{i-j} \] 以及初始值f[0], f[1], f[2], ··· , f[k - 1], 求f[n]. 输入格式 第一行两个整数n, k; 第二行k个整数,a[1] ~ a[k] 第三行k个整数,f[0] ~ f[k - 1] 输出格式 一行一个整数p, 是f[n] % 10000 的结果 example input 10 2 1 1 1 1 example

POJ3070 Fibonacci(矩阵快速幂加速递推)【模板题】

题目链接:传送门 题目大意: 求斐波那契数列第n项F(n). (F(0) = 0, F(1) = 1, 0 ≤ n ≤ 109) 思路: 用矩阵乘法加速递推. 算法竞赛进阶指南的模板: #include <iostream> #include <cstring> using namespace std; const int MOD = 10000; void mul(int f[2], int base[2][2]) { int c[2]; memset(c, 0, sizeof

[LGOJ]P1939【模板】矩阵加速(数列)[矩阵加速递推]

题面 矩阵加速递推的原理: 首先你得会矩阵乘法与快速幂. 以斐波拉契数列为例, 要从矩阵A \[ \begin{bmatrix} f[n-1] & f[n]  \end{bmatrix} \] 得到矩阵B \[ \begin{bmatrix} f[n] & f[n+1]  \end{bmatrix} \] 显然可以\[\begin{bmatrix} f[n-1] & f[n] \end{bmatrix}\times \begin{bmatrix}  0 & 1\\ 1 &a

[模板] 常系数线性递推

常系数线性递推 给定向量 \(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