要不是考到了,我还没发现这玩意我不是很会……


# 前置

  • 多项式取模;
  • 矩阵快速幂。

# 常系数齐次线性递推

描述的是这么一个问题,给定数列 \(c_1,c_2,\dots,c_k\) 以及数列 \(f\) 的前 \(k\) 项 \(f_0,f_1,\dots,f_{k-1}\),已知 \(f\) 有如下递推公式:

\[\begin{aligned}
(n\ge m)&&f_{n}=\sum_{i=1}^kc_if_{n-i}
\end{aligned}
\]

求 \(f_n \bmod 998244353\),其中 \(n\) 可以很大,\(k\) 是 \(10^5\) 左右的数。

  • 常系数:递推式的系数 \(c_i\) 均为常数;
  • 齐次:这意味着递推式没有常数项(如果有常数项就别想了);
  • 线性:\(f_i\) 的指数都为 \(1\)。

# 算法原理

对于这种系数为常数的问题,我们有一个通用的解法 —— 矩阵快速幂:

\[\begin{bmatrix}f_{n}\\f_{n + 1}\\\vdots\\f_{n + k - 1}\end{bmatrix}=\begin{bmatrix}0&1&0&\cdots&0\\0&0&1&\cdots&0\\0&0&0&\cdots&0\\\vdots&\vdots&\vdots&\ddots&\vdots\\c_k&c_{k - 1}&c_{k - 2}&\cdots&c_1\end{bmatrix}\times\begin{bmatrix}f_{n - 1}\\f_{n}\\\vdots\\f_{n + k - 2}\end{bmatrix}
\]

记最后那个 \(k\times k\) 的转移方阵为 \(A\),初始列向量为 \(St\)。常规的计算方法即计算

\[A^n\times St
\]

复杂度 \(\mathcal O(k^3\log n)\),主要的瓶颈在于矩阵乘法。

下面要介绍的算法给出了这样一种构造,其中 \(\{c_i\}\) 是针对 \(A^n\)(注意不仅与 \(A\) 有关,还与指数 \(n\) 有关)构造的数列 ——

\[\begin{aligned}
&A^n=\sum_{i=0}^{k-1}c_iA^i\\
&A^n\times St=\sum_{i=0}^{k-1}c_iA^i\times St
\end{aligned}
\]

目前看来好像没有什么茄子用,仍然需要计算矩乘。但是我们真的需要 \(A^n\times St\) 这整个向量吗?实际上我们只需要 \(f_n\),即 \(A^n\times St\) 的第一项。

再看看这个式子就可以发现它的用处了:

\[(A^n\times St)_1=\sum_{i=0}^{k-1}(c_iA^i\times St)_1=\sum_{i=0}^{k-1}c_i(A^i\times St)_1
\]

\(A^i\times St\) 的实际意义是将 \(St\) 转移 \(i\) 次。所以 \((A^i\times St)_1=f_i\),也即

\[f_n=\sum_{i=0}^{k-1}c_if_i
\]

这样就免去了矩乘。

这就是这个算法的全部内容了?还剩下一个问题,\(\{c_i\}\) 怎么构造?

定义函数 \(C(x)\) 如下,则要求 \(C(A)=A^n\)。

\[C(x)=\sum_{i=0}^{k - 1}c_ix^i
\]

接下来是一些魔法……如果我们有函数 \(F(x)\) 满足

\[F(A)=\sum_{i=0}^{k}f_iA^i=0
\]

且有 \(G(x)\) 满足:

\[x^n=G(x)F(x)+C(x)\to C(x)=x^n\bmod F(x)
\]

易得

\[A^n=G(A)F(A)+C(A)=C(A)
\]

利用多项式取模对快速幂稍加改造就可以计算 \(C(x)\)。

「稍 加 改 造」

说起来倒也简单,把多项式 $x$ 拿来做快速幂,对 $F(x)$ 取模。

然后我们发现又需要构造 \(F(x)\)……如果要对一个一般的方阵求 \(F(A)=0\) 那确实很难,但常系数齐次线性递推的转移矩阵 \(A\) 因为它的结构特殊,有一个简洁的构造:

  • \(f_k=1\);
  • \(f_{i}=-c_{k-i}\)(\(0\le i\lt k\))。

至于为什么这样构造,就涉及到矩阵的特征向量的内容,和这个算法本身没有太紧的关联。有兴趣的读者可以参考 shadowice1984 的洛谷博客


THE END

Thanks for reading!

我也曾 隐约想过 从这世界逃离

因为有无数次 和最优解失之交臂

那时耀眼的自己 定不会轻易容许

骄傲变得同墙角霉菌 不差毫厘

——《我也曾想过一了百了(中文填词)》 By 洛天依

> Link 我也曾想过一了百了 - Bilibili

「NOTE」常系数齐次线性递推的更多相关文章

  1. 常系数齐次线性递推 & 拉格朗日插值

    常系数齐次线性递推 具体记在笔记本上了,以后可能补照片,这里稍微写一下,主要贴代码. 概述 形式: \[ h_n = a_1 h_{n-1}+a_2h_{n-2}+...+a_kh_{n-k} \] ...

  2. 【Luogu4723】线性递推(常系数齐次线性递推)

    [Luogu4723]线性递推(常系数齐次线性递推) 题面 洛谷 题解 板子题QwQ,注意多项式除法那里每个多项式的系数,调了一天. #include<iostream> #include ...

  3. 【BZOJ4161】Shlw loves matrixI (常系数齐次线性递推)

    [BZOJ4161]Shlw loves matrixI (常系数齐次线性递推) 题面 BZOJ 题解 \(k\)很小,可以直接暴力多项式乘法和取模. 然后就是常系数齐次线性递推那套理论了,戳这里 # ...

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

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

  5. 【瞎讲】 Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18)

    [背诵瞎讲] Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18) 看CSP看到一题"线性递推式",不会做,去问了问zsy怎么做,他并 ...

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

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

  7. Re.常系数齐次递推

    前言 嗯   我之前的不知道多少天看这个的时候到底在干什么呢 为什么那么..  可能大佬们太强的缘故 最后仔细想想思路那么的emmm 不说了  要落泪了 唔唔唔 前置 多项式求逆 多项式除法/取模 常 ...

  8. 【BZOJ4944】[NOI2017]泳池(线性常系数齐次递推,动态规划)

    [BZOJ4944][NOI2017]泳池(线性常系数齐次递推,动态规划) 首先恰好为\(k\)很不好算,变为至少或者至多计算然后考虑容斥. 如果是至少的话,我们依然很难处理最大面积这个东西.所以考虑 ...

  9. 2019牛客暑期多校训练营(第五场)- B generator 1 (齐次线性递推+矩阵快速幂)

    题目链接:https://ac.nowcoder.com/acm/contest/885/B 题意:已知齐次线性式xn=a*xn-1+b*xn-2,已知a,b,x0,x1,求xn,n很大,n<= ...

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

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

随机推荐

  1. SpringMVC的常用操作汇总

    基本操作 #类级别的注解 @Controller @RestController @RequestMapping("/hello") #springMVC常用方法级别注解 @Res ...

  2. vue3 自定义组件中使用 v-model

    1.直接绑定 v-model,但是 Props 要固定为 modelValue 组件D: 注意这里的 Props 和 Emits,必须使用 Vue 提供的 defineProps() 和 define ...

  3. docker 搭建 nginxconfig.io 文档

    docker镜像仓库 https://hub.docker.com/r/devopstestlab/nginxconfig.io 获取镜像 docekr pull devopstestlab/ngin ...

  4. 使用Android studio配置软件签名,并在车机安装

    系统级APP,可在Androidmanifest.xml中配置属性,并使用系统级签名. 1. 签名方式 1.1 bulid.gradle(:app)中添加签名信息 1.2 使用Android stud ...

  5. CentOS7 设置防火墙、开放指定端口操作

    1, 查看防火墙状态: firewall-cmd --state systemctl status firewalld.service 2, 开启防火墙: systemctl start firewa ...

  6. 认识JavaWeb

    JavaWeb Java Web 1.基本概念 1.1.前言 web开发: web,网页的意思 , www.baidu.com 静态web html,css 提供给所有人看的数据始终不会发生变化! 动 ...

  7. 解决pdf电子签章显示问题(电子发票)

    在/build/pdf.worker.js注释掉一行代码 if (data.fieldType === "Sig") { data.fieldValue = null; // 注释 ...

  8. [Oracle19C ASM管理] ASM服务的启停

    自动方式启停 crsctl stat res -t 查看ASM服务的状态,it's ok that ora.ons和ora.diskmon是OFFLINE [grid@centos7-19c.loca ...

  9. 【阿里云ACP】-04(负载均衡SLB、弹性伸缩AS内容分发、网络与VPC)

    阿里云例题介绍-CDN F公司新推出一款手机APP,将安装包链接挂在公司的官网(基于云服务器ECS实例)进行下载(安装包大小:6Mb),上线前两个月下载速度还能接受.自从上周公司在CCTV做了一次广告 ...

  10. Excel error - the macros in this project are disabled, please refer to the online help or documentation of the host application to determine how to enable macros.

    alt+F11 进入vba界面,F5运行macro后报错. Sub 合并当前工作簿下的所有工作表() Application.ScreenUpdating = False For j = 1 To S ...