Re.常系数齐次递推
前言
嗯 我之前的不知道多少天看这个的时候到底在干什么呢
为什么那么。。 可能大佬们太强的缘故
最后仔细想想思路那么的emmm
不说了 要落泪了
唔唔唔
前置
常系数齐次递推目的
求一个满足k阶齐次线性递推数列ai的第n项
即:
给出f1--fk,a0--ak-1求an
N=1e9,K=32000
常系数齐次递推主要思路
emmm矩阵快速幂怎么样都应该会的
设转移矩阵为A,st=[a0,a1...ak-2,ak-1]为初始矩阵
显然an=(st*An)0
O(k3logn)和O(k2logklogn)的矩阵快速幂在此范围下显然太暴力了
发现k过大时时间复杂度主要花在矩阵乘法上
考虑如何不用矩阵通过多项式来计算答案
先考虑把An转化为A0--Ak-1组合出来的和
设An=Q(A)*G(A)+R(A)
Q,G,R是以矩阵为x(参数)的多项式
当强制G的多项式的最高次数为k次方
那么可写成An=Q(A)*G(A)+ciAi
此时如果再强制试使得G(A)为0时
那么Q(A)*G(A)=0
An=ciAi=R(A)
所以ciAi=An%G(A)
通过多项式取模就可将An转化为ciAi
通过上面的推导发现an=(st*An)0=(st*ciAi)0=(ciAist)0
因为我们每次只取矩阵的第0项 每转移一次下一项就往上移一个位置 原来的第0项就去掉
所以Aist就等于sti
最后的an=cisti
这样只要找出之前要求的那个G(A)就可以O(k)得出答案了
那么如何求出G(A)
设G(A)=giAi=0
这里有个我暂时不会的结论
如果递推系数为f1--fn
那么gk-i=fi,gk=1
所以最后流程就是
1.求出G(A)
2.用快速幂和多项式取模求出An在模G(A)时的余数R(A) 也就是把An转化为A1--Ak的组合
3.计算答案an=cisti
代码