正题

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


题目大意

给出序列aaa,和hhh的0∼k−10\sim k-10∼k−1项,满足
hn=∑i=1naihn−ih_n=\sum_{i=1}^na_ih_{n-i}hn​=i=1∑n​ai​hn−i​
求hnh_nhn​。

1≤n≤109,1≤k≤20001\leq n\leq 10^9,1\leq k\leq 20001≤n≤109,1≤k≤2000


解题思路

显然k≤2000k\leq 2000k≤2000我们就不能矩阵乘法了,然后就去研究了一下常系数线性齐次递推,而且这题k2k^2k2能过所以不用O(nlog⁡n)O(n\log n)O(nlogn)的多项式取模。

首先对于一个k×kk\times kk×k的矩阵AAA的特征多项式f(x)f(x)f(x)的定义是
f(x)=∑i=0kdet(A−kλ)xif(x)=\sum_{i=0}^kdet(A-k\lambda)x^if(x)=i=0∑k​det(A−kλ)xi
而我们知道对于这种递推式的特征多项式就是
f(x)=xk−∑i=0k−1aixif(x)=x^k-\sum_{i=0}^{k-1}a_ix^if(x)=xk−i=0∑k−1​ai​xi

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

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

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

这个东西要用到快速幂+多项式取模,O(k2)O(k^2)O(k2)的话实现起来很简单,考虑一个xk+i(i≥0)modf(x)x^{k+i}(i\geq 0)\mod f(x)xk+i(i≥0)modf(x)会发生什么,因为f(x)[k]=1f(x)[k]=1f(x)[k]=1所以⌊xk+if(x)⌋=xi\lfloor \frac{x^{k+i}}{f(x)}\rfloor=x^i⌊f(x)xk+i​⌋=xi相当于把xi(f(x)−xk)x^i(f(x)-x^k)xi(f(x)−xk)再丢回去就好了。

然后我们得到了一个多项式r(x)r(x)r(x),考虑怎么计算答案,只需要计算An−kh⃗A^{n-k}\vec{h}An−kh的最后一项,所以我们实际上求的r(x)=xn−kmodf(x)r(x)=x^{n-k}\mod f(x)r(x)=xn−kmodf(x),记r(x)r(x)r(x)的iii次系数为bib_ibi​,那么我们有
r(A)h⃗=∑i=0k−1biAih⃗r(A)\vec{h}=\sum_{i=0}^{k-1}b_iA^{i}\vec{h}r(A)h=i=0∑k−1​bi​Aih
所以我们算出hhh的k∼2k−1k\sim 2k-1k∼2k−1项然后就有
hn=∑i=0k−1r(x)[i]hk+ih_n=\sum_{i=0}^{k-1}r(x)[i]h_{k+i}hn​=i=0∑k−1​r(x)[i]hk+i​

时间复杂度:O(k2log⁡n)O(k^2\log n)O(k2logn)

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


code

#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;
}

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

  1. 【组合数学】递推方程 ( 常系数线性齐次递推方程 | 常系数、线性、齐次 概念说明 | 常系数线性齐次递推方程公式解法 | 特征根 | 通解 | 特解 )

    文章目录 一.常系数线性齐次递推方程 二.常系数.线性.齐次 概念说明 三.常系数线性齐次递推方程公式解法 四.常系数线性齐次递推方程公式解法内容概要 一.常系数线性齐次递推方程 常系数线性齐次递推方 ...

  2. 常系数齐次线性递推学习笔记

    定义 对于数列fff,如果有递推式 fn=∑i=1kai×fn−i(n≥k)f_n=\sum_{i=1}^k a_i\times f_{n-i} \quad (n\geq k)fn​=i=1∑k​ai ...

  3. 【学习小记】常系数齐次线性递推

    问题引入 给出数列 g g g,满足当 n > m n>m n>m时 g n = ∑ i = 1 m g n − i × a i g_n=\sum\limits_{i=1}^{m}g ...

  4. 【模板】BM + CH(线性递推式的求解,常系数齐次线性递推)

    这里所有的内容都将有关于一个线性递推: $f_{n} = \sum\limits_{i = 1}^{k} a_{i} * f_{n - i}$,其中$f_{0}, f_{1}, ... , f_{k ...

  5. [常系数(非)齐次线性递推]

    从一个朴素的问题出发:我们需要求出一个序列b[],使得符合递推式 f(n)=∑i=1..kcif(n−i) f ( n ) = ∑ i = 1.. k c i f ( n − i ) f(n)=\su ...

  6. hdu 5273 Dylans loves sequence 逆序数简单递推

    Dylans loves sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem ...

  7. BZOJ4161 常系数齐次线性递推

    问了数竞的毛毛搞了一番也没太明白,好在代码蛮好写先记下吧. 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=4 ...

  8. bzoj 4872 分手是祝愿 - 概率与期望 - 递推

    首先考虑,给你一个局面最少操作多少次,显然要从大往小按,可以证明这样是最优的.把这些按下的位置标记出来,可以证明一定要恰好按这些位置,别的不能动.因此问题转化为,给你一个序列,有若干位置需要被访问奇数 ...

  9. bzoj 3739 DZY loves math VIII

    3739: DZY loves math VIII Time Limit: 25 Sec Memory Limit: 512 MB Submit: 318 Solved: 50 [Submit][St ...

最新文章

  1. 深入讨论PHP5对象复制技术
  2. 连续时间傅里叶变换(FT)
  3. python网页爬虫-Python网页爬虫
  4. (转)如何用U盘创建Linux系统盘
  5. PyQt5 技术篇-设置输入框的placeholder方法,Qt Designer设置Line Edit、Text Edit编辑框的placeholder
  6. 发挥数据库价值,企业实现最大数据价值挖掘的路径在这里
  7. python 东哥 with open_Python一行代码搞定炫酷可视化,你需要了解一下Cufflinks
  8. python3中的while语句、if语句
  9. spring mvc 与 jasper Report集成
  10. Android官方开发文档Training系列课程中文版:电池续航时间优化之检查与监测坞的状态与类型
  11. cups支持的打印机列表_网络存储让你的打印机瞬间变无线,打印文件不用愁
  12. 【原创】构建高性能ASP.NET站点 第五章—性能调优综述(后篇)
  13. 微信小程序运行的底层逻辑
  14. 昇腾万里·让AI无所不及!DevRun开发者沙龙在武汉成功举办
  15. Python知识点入门笔记——特色数据类型(字典)
  16. python提示AttributeError: 'NoneType' object has no attribute 'append'
  17. Nmap简单使用教程
  18. gulp项目找不到html标签,通过yeoman、gulp、angular编写前段时的html模板处理,打包后找不到html的问题解决...
  19. 亚马逊跨境电商如何运营模式?
  20. c语言用随机投点法计算圆周率,(原创精品)用随机投点法计算π值【compute π with dartpoint randomly】...

热门文章

  1. python从random生成列表_详解Python利用random生成一个列表内的随机数
  2. vue路由上的#/怎么去掉_如何去掉vue路由中的#
  3. java jli.dll_JVM、JRE、JDK之间的区别和联系,你居然还不知道?
  4. java接口课程_用java定义一个接口,用于查询课程
  5. python except用法和作用_121个问题答对80%那么恭喜你,Python的高薪工作迟早有你一份...
  6. oracle leg函数,032-函数的嵌套与LEGB原则
  7. 邮箱通知php,PHPMailer 发送邮件(含详细介绍及使用方法说明)
  8. leetcode47. 全排列 II
  9. 815 计算机专业基础综合,2018年华东理工大学信息科学与工程学院815计算机专业基础综合之计算机操作系统考研基础五套测试题...
  10. 用一个单链表L实现一个栈(算法导论第十章10.2-2题)