分析:

  我们可以写把转移矩阵A写出来,然后求一下它的特征多项式,经过手动计算应该是这样的p(x)=$x^k-\sum\limits_{i=1}^ka_i*x^{k-i}$

  根据Cayley-Hamilton定理可得,p(A)=0

  他表示$A^n = f(A) * p(A) + g(A)$

  第一项的值是0,所以即$A^n=g(A)$,其中f(A) g(A)都是关于A的多项式,f(A)是多项式除法的商,g(A)是余数

  我们考虑$x^n$这个多项式,我们去求出它对于$p(A)$的余数多项式$g(A)$,那么$A^n$就等价于了$g(A)$,注意到新的多项式次数就很低了,不超过k-1

  我们要求的是$A^nH=\sum\limits_{i=0}^{k-1}c_i*A^i*H$的第一个元素,注意到$A^i*H$相当于把H又递推了i次

  所以结果等价于$A^nH=\sum\limits_{i=0}^{k-1}c_i*A^i*H$

  时间复杂度$O(k^2 log n)$,但常数很大

  中间的多项式取模和递推可以用FFT来优化,但常数更巨大

 #include<bits/stdc++.h>
using namespace std;
const int maxn=,mod=;
int a[maxn+],p[maxn+],ans[maxn+],num[maxn+];
int h[maxn+],tmp[maxn+];
int n,k;
void mul(int *a,int *b,int *ans)
{
for(int i=;i<=*k;++i) tmp[i]=;
for(int i=;i<k;++i)
for(int j=;j<k;++j)
tmp[i+j]=(tmp[i+j]+1LL*a[i]*b[j])%mod;
for(int i=*k-;i>=k;--i)
{
for(int j=k-;j>=;--j)
tmp[i-k+j]=(tmp[i-k+j]-1LL*tmp[i]*p[j])%mod,tmp[i-k+j]=(tmp[i-k+j]+mod)%mod;
tmp[i]=;
}
for(int i=;i<k;++i) ans[i]=tmp[i];
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=k;++i) scanf("%d",&a[i]);
for(int i=;i<k;++i) scanf("%d",&h[i]);
p[k]=;
for(int i=;i<=k;++i) p[k-i]=mod-a[i];
for(int i=k;i<*k;++i)
for(int j=;j<=k;++j)
{
h[i]=h[i]+1LL*h[i-j]*a[j]%mod;
h[i]%=mod;
}
if(n<*k) return *printf("%d\n",h[n]);
int b=n-k+;
num[]=,ans[]=;
while(b)
{
if(b&) mul(ans,num,ans);
mul(num,num,num);
b>>=;
}
long long res=;
for(int i=;i<k;++i) res=(res+1LL*ans[i]*h[i+k-])%mod;
printf("%lld\n",(res+mod)%mod);
return ;
}

bzoj4161 (k^2logn求线性递推式)的更多相关文章

  1. Berlekamp Massey算法求线性递推式

    BM算法求求线性递推式   P5487 线性递推+BM算法   待AC.   Poor God Water   // 题目来源:ACM-ICPC 2018 焦作赛区网络预赛 题意   God Wate ...

  2. 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式

    矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b     *     A B   =   a*A+b*C  a*c+b*D c d     ...

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

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

  4. BM求线性递推模板(杜教版)

    BM求线性递推模板(杜教版) BM求线性递推是最近了解到的一个黑科技 如果一个数列.其能够通过线性递推而来 例如使用矩阵快速幂优化的 DP 大概都可以丢进去 则使用 BM 即可得到任意 N 项的数列元 ...

  5. 2018 焦作网络赛 L Poor God Water ( AC自动机构造矩阵、BM求线性递推、手动构造矩阵、矩阵快速幂 )

    题目链接 题意 : 实际上可以转化一下题意 要求求出用三个不同元素的字符集例如 { 'A' .'B' .'C' } 构造出长度为 n 且不包含 AAA.BBB CCC.ACB BCA.CAC CBC ...

  6. 线性齐次递推式快速求第n项 学习笔记

    定义 若数列 \(\{a_i\}\) 满足 \(a_n=\sum_{i=1}^kf_i \times a_{n-i}\) ,则该数列为 k 阶齐次线性递推数列 可以利用多项式的知识做到 \(O(k\l ...

  7. P1067Warcraft III 守望者的烦恼(十大矩阵问题之七求递推式)

    https://vijos.org/p/1067 守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条行的,守望者warden拥有一个技能名叫“闪烁”,这个技能可以把她 ...

  8. LG5487 【模板】线性递推+BM算法

    [模板]线性递推+BM算法 给出一个数列 \(P\) 从 \(0\) 开始的前 \(n\) 项,求序列 \(P\) 在\(\bmod~998244353\) 下的最短线性递推式,并在 \(\bmod~ ...

  9. 【THUSC2017】【LOJ2981】如果奇迹有颜色 DP BM 打表 线性递推

    题目大意 有一个 \(n\) 个点的环,你要用 \(m\) 中颜色染这 \(n\) 个点. 要求连续 \(m\) 个点的颜色不能是 $1 \sim m $ 的排列. 两种环相同当且仅当这两个环可以在旋 ...

随机推荐

  1. 【转载】Hierarchal Temporal Memory (HTM)

    最近在看机器学习,看能否根据已有的历史来预测Hardware的故障发生概率.下文是一篇很有意思的文章,转自 http://numenta.org/htm.html. NuPIC是一个开源项目,用来实现 ...

  2. XSS漏洞扫描经验分享

    关于XSS漏洞扫描,现成的工具有不少,例如paros.Acunetix等等,最近一个项目用扫描工具没有扫出漏洞,但还是被合作方找出了几个漏洞.对方找出的漏洞位置是一些通过javascript.ajax ...

  3. 更新github上的代码

    昨晚熬夜写完了"git上传本地项目代码到github"的任务,早上来公司先把早上的工作完成后,抽点时间继续来继续更新文章 更新github上的代码 一.克隆代码 1.把大神的代码c ...

  4. 在Windows 10 系统上启用Hyper V遇到的错误:0x800f0831

    Hyper-V是微软的一款虚拟化技术,是微软第一个采用类似Vmware和Citrix开源Xen一样的基于hypervisor的技术. 在Windows 10的powershell命令里,输入如下的命令 ...

  5. TIOJ1208 第K大连续和

    第k大的题一般都有点麻烦 pbds库的tree,需要研究一下https://codeforces.com/blog/entry/11080find_by_order() and order_of_ke ...

  6. CAD交互绘制样条线(网页版)

    在CAD设计时,需要绘制样条线,用户可以设置样条线线重及颜色等属性. 主要用到函数说明: _DMxDrawX::SendStringToExecuteFun 把命令当着函数执行,可以传参数.详细说明如 ...

  7. 解决Invalid bound statement (not found)(Mybatis的Mapper绑定问题)

    一.问题描述 使用mybatis的项目在本地可以正常运行,但当使用maven或Jenkins打包部署到服务器上时出现了绑定错误,异常信息为: org.apache.ibatis.binding.Bin ...

  8. windows10家庭版 远程桌面报错

    windows10家庭版 远程桌面报错“要求的函数不受支持 ...”,Windows没有编辑组策略选项(gpedit.msc),所以无法按照微软提供的方法来修改组策略.所以我们需要修改注册表的方法来修 ...

  9. vue获取v-model数据类型boolean改变成string

    问题描述 今天产品问我一线上bug,怎么radio类型改不了 问题分析 看代码,之前的哥们儿是怎么写的 //页面 <div class="ui-form-box"> & ...

  10. C指针复制字符串从一个数组到另一个数组

    #include <stdio.h> void  copyString (char  *to, char  *from) {      while ( *from ) // from指针遇 ...