【模板】BM + CH(线性递推式的求解,常系数齐次线性递推)
这里所有的内容都将有关于一个线性递推:
$f_{n} = \sum\limits_{i = 1}^{k} a_{i} * f_{n - i}$,其中$f_{0}, f_{1}, ... , f_{k - 1}$是已知的。
BM是用于求解线性递推式的工具,传入一个序列,会返回一个合法的线性递推式,一个$vector$,其中第$i$项表示上式的$a_{i + 1}$。
CH用于快速求解常系数齐次线性递推的第$n$项,我们先会求出一个特征多项式$g$,$g$的第$k$项是$1$,其余项中第$k - i$项是$-a_{i}$。然后可以得到$c = x^{n} \; mod \; g$这么一个多项式,最后的答案就是$\sum\limits_{i = 0}^{k - 1} c_{i} * f_{i}$,这里用$c_{i}$表示$c$中第$i$项的系数。
其实这里只是想给出两者的板子,素质二连:
namespace BM{ #define pb push_back #define SZ(x) ((int)x.size()) #define REP(i, a, b) for (int i = a; i < b; ++i)LL Pow(LL x, LL b) {LL re = 1;x %= MOD, assert(b >= 0);for (; b; b >>= 1, x = x * x % MOD)if (b & 1) re = re * x % MOD;return re;}VI Bm(VI x) {VI ls, cur;int pn = 0, lf, ld;REP(i, 0, SZ(x)) {LL t = -x[i] % MOD;REP(j, 0, SZ(cur))t = (t + x[i - j - 1] * (LL)cur[j]) % MOD;if (!t) continue;if (cur.empty()) {cur.resize(i + 1);lf = i, ld = t;continue;}LL k = -t * Pow(ld, MOD - 2) % MOD;VI c(i - lf - 1);c.pb(-k);REP(j, 0, SZ(ls)) c.pb(ls[j] * k % MOD);if (c.size() < cur.size())c.resize(cur.size());REP(j, 0, SZ(cur))c[j] = (c[j] + cur[j]) % MOD;if (i - lf + SZ(ls) >= SZ(cur))ls = cur, lf = i, ld = t;cur = c;}VI &o = cur;REP(i, 0, SZ(o))o[i] = (o[i] % MOD + MOD) % MOD;return o;} }namespace CH { #define SZ(x) ((int)x.size())VI g;int k;inline void Ad(int &a, int b) {if ((a += b) >= MOD) a -= MOD;}VI Mul(VI a, VI b) {VI c;assert(SZ(a) <= k && SZ(b) <= k);c.resize(SZ(a) + SZ(b) - 1);for (int i = 0; i < SZ(a); ++i)for (int j = 0; j < SZ(b); ++j)Ad(c[i + j], (LL)a[i] * b[j] % MOD);for (int i = SZ(c) - 1; i >= k; --i)for (int j = 0; j <= k; ++j)Ad(c[i - k + j], MOD - (LL)c[i] * g[j] % MOD);c.resize(k);return c;}VI Solve(VI a, int n) {k = SZ(a);g.resize(k + 1, 1);for (int i = 1; i <= k; ++i)g[k - i] = (MOD - a[i - 1]) % MOD;VI re(1, 1), x(2, 1);x[0] = 0;for (; n; n >>= 1, x = Mul(x, x))if (n & 1) re = Mul(re, x);return re;} }
View Code
转载于:https://www.cnblogs.com/Dance-Of-Faith/p/9810513.html
【模板】BM + CH(线性递推式的求解,常系数齐次线性递推)相关推荐
- 常系数齐次线性递推学习笔记
定义 对于数列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∑kai ...
- 【学习小记】常系数齐次线性递推
问题引入 给出数列 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 ...
- BZOJ4161 常系数齐次线性递推
问了数竞的毛毛搞了一番也没太明白,好在代码蛮好写先记下吧. 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=4 ...
- [常系数(非)齐次线性递推]
从一个朴素的问题出发:我们需要求出一个序列b[],使得符合递推式 f(n)=∑i=1..kcif(n−i) f ( n ) = ∑ i = 1.. k c i f ( n − i ) f(n)=\su ...
- 算法分析中递推式的一般代数解法
算法分析中经常遇到需要求解递推式的情况,即将递推式改写为等价的封闭形式.例如汉诺塔问题的时间复杂度递推形式为T(n)=2T(n−1)+1(n≥1)T(n)=2T(n−1)+1(n≥1),可以解出封闭形 ...
- 【组合数学】二项式定理与组合恒等式 ( 二项式定理 | 三个组合恒等式 递推式 | 递推式 1 | 递推式 2 | 递推式 3 帕斯卡/杨辉三角公式 | 组合分析方法 | 递推式组合恒等式特点 )
文章目录 一.二项式定理 二.组合恒等式 ( 递推式 1 ) 三.组合恒等式 ( 递推式 2 ) 四.组合恒等式 ( 递推式 3 ) 帕斯卡 / 杨辉三角公式 五.组合分析方法 六.递推式组合恒等式特 ...
- 超前进位加法器原理与递推式超详细推导+verilog实现与测试
当记忆的线缠绕过往支离破碎,是慌乱占据了心扉.----<寂寞沙洲冷> 超前进位加法器原理 1. 一位二进制的加法 首先考虑两个1位二进制相加 a+b,不考虑上一级的进位,0和1简单相加,即 ...
- 推式配货(Push)、拉式配货(Pull)和配送需求计划(DRP)的区别
随着电子商务的迅猛发展,物流配送服务已然成为企业竞争最为核心的环节,一个全面.完善的物流配送方案,能够帮助企业满足客户交期.节约运输和库存成本,促进各环节沟通,提高生产稳定性.同时,物流配送的许多环节 ...
- 市场调研—全球与中国手推式扫地机市场现状及未来发展趋势
[报告篇幅]:126 [报告图表数]:171 [报告出版时间]:2021年1月 2019年,全球手推式扫地机市场规模达到了xx亿元,预计2026年将达到xx亿元,年复合增长率(CAGR)为xx%. 本 ...
最新文章
- 自定义Push和Pop过渡动画
- ASP.NET MVC 3 RTM
- Serilog 日志框架如何自动删除超过 N 天的日志 ?
- leetcode初级算法3.存在重复元素
- php键值对数组排序,PHP按指定键值对二维数组进行排序的方法_PHP
- 一行python代码值多少钱_一行python代码
- 开源 | 高颜值神经网络可视化工具
- 微服务开发及部署_基于 Kubernetes 的微服务部署即代码
- Asp.Net母版页和内容页运行机制
- linux服务器配置python环境_服务器python环境配置福利,CentOS ,Linux 一键下载python3和环境配置...
- Python:使用ctypes库调用外部DLL
- 微支付几个参数的获得
- 从0到1设计通用数据大屏搭建平台
- 支付宝小程序下单支付接口:40004 ACQ.INVALID_PARAMETER
- 通过c#打开pdf文件
- spring boot redisLock redis分布式锁
- 快速上手IntelliJ IDEA常用快捷键
- 搭载“鸿蒙”的华为Watch 3,是智能手表的标准答案吗?
- windows双系统如何删除ubuntu系统并重装
- 全国英语计算机等级考试报名费,通知 | 全国大学生英语竞赛计算机等级考试报名...
热门文章
- java位运算(、|、 ~、、 、 ^)
- Splash resource_timeout 属性
- IP地址转换函数——inet_pton inet_ntop inet_aton inet_addr inet_ntoa
- jQuery 的属性操作方法
- Java串口通信具体解释
- DLL程序组件Microsoft Reporting Services Barcode Custom Report Item
- ASP.NET 程序中常用的三十三种代码(1)
- 图像优化算法(HE、AHE、CLAHE)简单介绍
- linux内核数据结构实现--链表、队列和哈希
- (4)verilog语言编写计数器