首页 > 其他 > 详细

[高端操作]常系数线性递推式

时间:2018-12-11 21:02:45      阅读:109      评论:0      收藏:0      [点我收藏+]

对一个常系数线性递推式$$f_n = \sum_{i=1}^k a_i \times f_{n-i}$$

矩阵快速幂需要 $O(k^3logn)$ ?

这篇文章将教您在至多为 $O(k^2logn + k^4)$ 时间内搞这个式子

有什么用嘛,可能对我这种省选注定退役的人没啥用,但对于 NOI 及以上比赛想 AK 的同学们可能有用

 

1.矩阵的特征多项式

矩阵 $A$ 的特征多项式是一个关于 $\lambda$ 的函数 $f(\lambda)=det(\lambda I - A)$,其中 $I$ 为单位矩阵,$det()$ 为行列式

 

2.Caylay-Hamilton 定理

就一句话,$f(A) = 0$,证明略

 

3.求矩阵特征多项式的方法

 

  1) 消一消 

  考虑根据定义,需要求行列式,消一下就可以了,复杂度 $O(k^5)$ 或 $O(k^4)$

 

  2)插一插

  考虑到特征多项式是一个 $k$ 次的多项式,我们可以把 $\lambda = 0,1,2, \cdots ,k$ 时的点值求出来,然后拉格朗日插值,复杂度 $O(k^4)$

 

4.有啥用

 

根据小学知识

$$被除数 ÷ 除数 = 商 \cdots \cdots 余数$$

我们发现,一个次数大于等于 $k$ 的矩阵幂,可以把它除以 $f(A)$

之后我们发现:因为除数等于 $0$ ,所以$余数 = 被除数$

然后我们发现,余数的次数不超过 $k$

于是我们可以用类似快速幂的做法倍增,把 $n$ 次的矩阵幂变成一个不超过 $k$ 次的多项式

其中每一步如果用快速的多项式取模 (FFT) ,是 $O(klogk)$ 的,如果暴力,是 $O(k^2)$ 的

这一步的复杂度是 $O(klogklogn)$ 或者 $O(k^2logn)$

 

然后就做完了。。。看上去很简单,但我们可以数数,一道完整的题,您要写多少代码

1.多项式相关操作(FFT,求逆,取膜)

2.构造矩阵(dfs / 根据题目情况而定)

3.构造特征多项式(消元 / 拉格朗日插值)

4.倍增的单步转移

5.倍增的全过程

嗯...不是很长?

[高端操作]常系数线性递推式

原文:https://www.cnblogs.com/Kong-Ruo/p/10105106.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!