常系数齐次线性递推

常系数齐次线性递推

给定递推式\(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_2...\alpha_K\)。

有\(f_n\)的母函数\(G(x) = \frac{P(x)}{(1-\alpha_1 x)(1-\alpha_2 x)...(1-\alpha_K x)}\)。

对于非重根\(\alpha\),它在通项公式\(T_n\)中的贡献形如\(A \alpha^n\),其中\(A\)为待定系数。

对于重根\(\beta\),设其为\(r\)重根,它在通项公式中的贡献形如\((\sum_{i=1}^r h_i n^{r-i} )\beta^n\)。

根据上述把通项式\(T_n\)列出来,利用前\(K\)项待定系数即可得到通项公式。

求齐次线性递推式

定义向量\(A_i = (f_i,f_{i+1},f_{i+2}...f_{i+k-1})\),定义转移矩阵\(M\)。

初始我们知道\(A_0 = (f_0,f_1,f_2...f_{k-1})\),现在要求\(f_n\),即求\(A_n = (f_n,f_{n+1}...f_{n+k-1})\)。

可以矩阵快速幂\(A_0*M^{n}\),复杂度\(O(k^3logn)\)。

将转移矩阵\(M\)带入特征多项式有:\(F(M) = M^k - \sum_{i=1}^k a_i M^{k-i}\)。

根据某定理,我们有\(F(M) = 0\),所以我们可以对\(M^n\)化简,即\(M^n \equiv G(M)\ (mod\ F(M))\)。

即我们求出\(G(M)\),那么\(A_0G(M)\)与\(A_0M^n\)等价。

\(A_n = A_0G(M) = A_0\sum_{i=0}^{k-1} g_i M^i\),其中\(g_i\)即我们多项式取模后第\(i\)项的系数。

然后\(A_n = \sum_{i=0}^{k-1} g_i A_0M^i\)。我们只需要求\(f_n\),即只需要知道向量\(A\)的第一项。

所以\(A = A_0M^i\)的第一项是什么?不就是\(f_i\)吗!而\(f_i,i\in [0,k-1]\)我们事先知道。

所以\(f_n = \sum_{i=0}^{k-1} g_i f_i\)。

实现上,关键在于求\(G(x)\),显然\(M^n\)我们不能一开始就把它存成一个多项式,所以需要倍增。

倍增的同时需要多项式乘法与多项式取模,

暴力做的话总复杂度为\(O(k^2logn)\),使用多项式运算复杂度为\(O(klogklogn)\)。

原文地址:https://www.cnblogs.com/GuessYCB/p/10165931.html

时间: 2024-10-29 16:42:21

常系数齐次线性递推的相关文章

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

引入: 对于递推方程: $$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)$$ 成立,那

常系数齐次线性递推初探

常系数齐次线性递推式第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[

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$

常系数齐次线性微分方程

二阶 变系数 齐次 线性微分方程: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

递推递归小结

已经被递推递归虐了几天了,(┙>∧<)┙へ┻┻ 但是显而易见的是没有任何进展...作为一块并不Q弹好吃的连1116都不会写的蒟蒻突然饿了,我还能说什么呢. 所以只能给对面的一群大神跪了%%%%%%%%%%%%%orz 递推递归主要就是找思路,找到思路就并没有什么区别了. 但是我找不到思路啊 ╮(╯_╰)╭ 所以就找题解,但是递推专项找到的最齐的只有Pascal的代码,所以就看着Pascal的代码码了几道,于是到现在依然是明白了了几道题但是找不到规律一脸懵逼(=?ω?=)神圣与邪恶有汉化更新了呢

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

hdu 1267 递推

下沙的沙子有几粒? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4326    Accepted Submission(s): 2268 Problem Description 2005年11月份,我们学校参加了ACM/ICPC 亚洲赛区成都站的比赛,在这里,我们获得了历史性的突破,尽管只是一枚铜牌,但获奖那一刻的激动,也许将永远铭刻