前言

嗯   我之前的不知道多少天看这个的时候到底在干什么呢

为什么那么。。  可能大佬们太强的缘故

最后仔细想想思路那么的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


代码

这 时隔多年我中于调出来了一份常数巨大的代码

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
#define C getchar()-48
inline ll read()
{ll s=0,r=1;char c=C;for(;c<0||c>9;c=C) if(c==-3) r=-1;for(;c>=0&&c<=9;c=C) s=(s<<3)+(s<<1)+c;return s*r;
}
const int p=998244353,G=3,N=140010;
int n,k,mx,cs,qvq,tz;
ll rev[N];
ll f[N],st[N],g[N],invg[N];
ll tmp[N],tmp1[N],tmp2[N],tmpa[N],tmpb[N];
ll a[N],ans[N];
inline ll ksm(ll a,ll b)
{ll ans=1;while(b){if(b&1) ans=(ans*a)%p;a=(a*a)%p;b>>=1;}return ans;
}
inline void ntt(ll *a,ll n,ll kd)
{for(int i=0;i<n;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);for(int i=1;i<n;i<<=1){ll gn=ksm(G,(p-1)/(i<<1));for(int j=0;j<n;j+=(i<<1)){ll t1,t2,g=1;for(int k=0;k<i;k++,g=g*gn%p){t1=a[j+k],t2=g*a[j+k+i]%p;a[j+k]=(t1+t2)%p,a[j+k+i]=(t1-t2+p)%p;} }}if(kd==1) return;ll ny=ksm(n,p-2);reverse(a+1,a+n);for(int i=0;i<n;i++) a[i]=a[i]*ny%p;
}
inline void cl(ll *a,ll *b,ll n,ll m,ll len,ll w)
{for(int i=0;i<len;i++) tmp1[i]=i<n?a[i]:0;for(int i=0;i<len;i++) tmp2[i]=i<m?b[i]:0;for(int i=0;i<len;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(w-1));
}
inline void polyinv(ll *a,ll *b,ll ed)
{b[0]=ksm(a[0],p-2);for(int k=1,j=0;k<=(ed<<1);k<<=1,j++){ll len=k<<1;cl(a,b,k,k,len,j+1);ntt(tmp1,len,1);ntt(tmp2,len,1);for(int i=0;i<len;i++) b[i]=tmp2[i]*(2ll-tmp1[i]*tmp2[i]%p+p)%p;ntt(b,len,-1);for(int i=k;i<len;i++) b[i]=0;}
}
inline void polymul(ll *a,ll *b,ll *c,ll n,ll m)
{ll len=1,w=0;while(len<=(n+m)) len<<=1,w++;cl(a,b,n,m,len,w);ntt(tmp1,len,1);ntt(tmp2,len,1);for(int i=0;i<len;i++) c[i]=tmp1[i]*tmp2[i]%p;ntt(c,len,-1);
}
inline void polymod(ll *a,ll n=mx<<1,ll m=k)
{                   int ed=(mx<<1);while(a[--ed]==0);if(ed<k) return; n=ed;reverse(a,a+1+n);polymul(a,invg,tmpa,n+1,n-m+1);    reverse(tmpa,tmpa+n-m+1);reverse(a,a+1+n);polymul(g,tmpa,tmpb,m+1,n-m+1);for(int i=0;i<k;i++) a[i]=(a[i]-tmpb[i]+p)%p;for(int i=k;i<=ed;i++)a[i]=0;for(int i=0;i<(mx<<1);i++) tmpa[i]=tmpb[i]=0;
}
int main()
{n=read(),k=read();mx=1,cs=0;while(mx<=k) mx<<=1,cs++;for(int i=1;i<=k;i++) f[i]=read(),f[i]=f[i]<0?f[i]+p:f[i];for(int i=0;i<k;i++) st[i]=read(),st[i]=st[i]<0?st[i]+p:st[i];for(int i=1;i<=k;i++) g[k-i]=p-f[i];g[k]=1;for(int i=0;i<=k;i++) tmp[i]=g[i];reverse(tmp,tmp+1+k);polyinv(tmp,invg,mx);for(int i=mx;i<=(mx<<1);i++) invg[i]=0;for(int i=0;i<=k;i++) tmp[i]=0;for(int i=0;i<(mx<<1);i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(cs+1-1));ans[0]=1;a[1]=1;while(n){if(n&1){polymul(ans,a,ans,k,k); polymod(ans);}polymul(a,a,a,k,k); polymod(a);n>>=1;}for(int i=0;i<k;i++) qvq=(qvq+ans[i]*st[i])%p;cout<<qvq; return 0;
}

转载于:https://www.cnblogs.com/1436177712qqcom/p/10497930.html

Re.常系数齐次递推相关推荐

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

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

  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. BZOJ4161 常系数齐次线性递推

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

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

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

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

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

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

    正题 题目链接:https://darkbzoj.tk/problem/4161 题目大意 给出序列aaa,和hhh的0∼k−10\sim k-10∼k−1项,满足 hn=∑i=1naihn−ih_n ...

  8. 【数字信号处理】线性常系数差分方程 ( 使用递推解法求解 “ 线性常系数差分方程 “ | “ 线性常系数差分方程 “ 初始条件的重要性 )

    文章目录 一.使用递推解法求解 " 线性常系数差分方程 " 二." 线性常系数差分方程 " 初始条件的重要性 一.使用递推解法求解 " 线性常系数差分 ...

  9. 有理展开定理与递推数列通项公式

    可以结合 https://blog.csdn.net/ez_lcw/article/details/125731258?spm=1001.2014.3001.5502. 不同根的有理展开定理 设 R ...

  10. 【组合数学】递推方程 ( 常系数线性非齐次递推方程求解 | 递推方程标准型及通解 | 递推方程通解证明 )

    文章目录 一.递推方程标准型及通解 二.递推方程通解证明 一.递推方程标准型及通解 H(n)−a1H(n−1)−⋯−akH(n−k)=f(n)H(n) - a_1H(n-1) - \cdots - a ...

最新文章

  1. 使用winrar自解压功能制作安装包
  2. 论信息系统的项目范围管理
  3. 二、Netty服务端/客户端启动整体流程
  4. linux mail命令查看邮件/mail控制台
  5. 深入浅出LVS:企业集群平台负载均衡的三种模式和算法实现
  6. spring-初始化完成后运行指定内容
  7. Js中数组Array的用法
  8. 【NOIP2002】【Luogu1032】字串变换
  9. 如何搭建maven中,分布式工程
  10. SQL查询语句-返回名称的分类
  11. Python3中Dict不能在循环中删除元素
  12. Allegro各属性说明如 Clines或者Cline Segs
  13. 【雕爷学编程】Arduino动手做(108)---GY-521三轴模块
  14. STM32F103_study60_The punctual atoms(Input capture experimentInput)
  15. blas、lapack、atlas在Ubuntu上的安装
  16. 如何快速剪辑多个视频,将视频分段保存导出播放
  17. 2022央企施工企业加速推进数字化转型赋能高质量发展
  18. Fire And Motion(英文原版) [转]
  19. C#winform 经典小游戏贪吃蛇V1.0(一)
  20. 比较有效的Windows10卡硬盘解决方法

热门文章

  1. Facebook原型网站FaceMash域名拍得3万美元
  2. 万网域名证书如何查询下载_备案域名证书获取
  3. 大龄程序员的出路究竟在何处?从369个过来人问答贴里,我们得到了答案
  4. pycharm复制一行
  5. 基于java的springboot宠物商城系统毕业设计springboot开题报告
  6. Linux - last 命令
  7. 企业网站建设流程是什么?三个流程要知道
  8. [目标跟踪] 论文笔记:Parallel Tracking and Verifying(PTAV-Update)
  9. IntelliJ IDEA的maven如何提高下载速度
  10. 手机上的环境光传感器