bzoj#4161-Shlw loves matrixI【常系数线性齐次递推】

1|0正题

题目链接:https://darkbzoj.tk/problem/4161


1|1题目大意

给出序列a,和h0k1项,满足

hn=i=1naihni

hn

1n109,1k2000


1|2解题思路

显然k2000我们就不能矩阵乘法了,然后就去研究了一下常系数线性齐次递推,而且这题k2能过所以不用O(nlogn)的多项式取模。

首先对于一个k×k的矩阵A的特征多项式f(x)的定义是

f(x)=i=0kdet(Akλ)xi

而我们知道对于这种递推式的特征多项式就是

f(x)=xki=0k1aixi

然后有个Cayley-Hamilton定理就是说对于A的特征多项式f(x)满足f(A)=0

如果按照这种特殊的特征多项式去理解的话挺好懂的,但是实际上的就不会证了。

那么我们如果要求一个转移矩阵An=Anmodf(A),我们可以求出一个多项式r(x)=xnmodf(x),然后直接把A带入这个多项式就好了。

这个东西要用到快速幂+多项式取模,O(k2)的话实现起来很简单,考虑一个xk+i(i0)modf(x)会发生什么,因为f(x)[k]=1所以xk+if(x)=xi相当于把xi(f(x)xk)再丢回去就好了。

然后我们得到了一个多项式r(x),考虑怎么计算答案,只需要计算Ankh的最后一项,所以我们实际上求的r(x)=xnkmodf(x),记r(x)i次系数为bi,那么我们有

r(A)h=i=0k1biAih

所以我们算出hk2k1项然后就有

hn=i=0k1r(x)[i]hk+i

时间复杂度:O(k2logn)

值得一提的是如果转移矩阵A不是一个递推式的矩阵,我们也可以用拉格朗日插值插出它的特征多项式从而降低平均的复杂度。


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=4100,P=1e9+7; ll n,k,a[N],p[N],h[N],b[N],f[N],tmp[N]; void Mul(ll *a,ll *b,ll *c){ memset(tmp,0,sizeof(tmp)); for(ll i=0;i<k;i++) for(ll j=0;j<k;j++) (tmp[i+j]+=a[i]*b[j]%P)%=P; for(ll i=2*k-2;i>=k;i--) for(ll j=0;j<k;j++) (tmp[i+j-k]+=P-tmp[i]*p[j]%P)%=P; for(ll i=0;i<k;i++)c[i]=tmp[i]; return; } signed main() { scanf("%lld%lld",&n,&k); for(ll i=1;i<=k;i++) scanf("%lld",&a[i]),a[i]=(a[i]+P)%P,p[k-i]=P-a[i]; for(ll i=0;i<k;i++) scanf("%lld",&h[i]),h[i]=(h[i]+P)%P; for(ll i=k;i<(k<<1);i++) for(ll j=1;j<=k;j++) (h[i]+=h[i-j]*a[j]%P)%=P; if(n<(k<<1))return printf("%lld\n",h[n])&0; b[1]=p[k]=f[0]=1; ll B=n-k,ans=0; while(B){ if(B&1)Mul(f,b,f); Mul(b,b,b);B>>=1; } for(ll i=0;i<k;i++) (ans+=f[i]*h[i+k]%P)%=P; printf("%lld\n",ans); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15346227.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(58)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示