\(BM\) 算法

用处

它可以用来求常系数线性递推的系数,并且可以求出最短的

求出来有什么用呢?

你可以闷声Cayley-Hamilton定理优化递推矩阵快速幂

算法简介

首先设一个数列 \(f\),我们想要试出其中满足

\(f_n=\sum_{i=1}^{m}a_if_{n-i}(n>m)\)

的最小的 \(m\) 以及对应的系数 \(a\)

考虑增量法构造

  1. 首先因为要求 \(n>m\),所以 \(m=n\) 且 \(a\) 都为 \(0\) 显然是满足条件的,所以初始可以就是全 \(0\)
  2. 假设有一个长度为 \(m\) 的 \(a\) 在 \(f_{1...n-1}\) 都满足条件,并且 \(f_n\) 不满足了

    设 \(delta_n=\sum_{i=1}^{m}f_{n-i}a_i-f_n\)

    我们只要构造出一个长度为 \(m'\) 最短的 \(a'\)

    使得 \(\sum_{i=1}^{m'}f_{n-i}a'_i=-delta_n\) 然后 \(a,a'\) 按位相加就好了

    怎么找到呢,实际上我们之前已经存在有一些不满足条件的情况

    假设有个 \(x\)

    \(delta_x=\sum_{i=1}^{m'}f_{x-i}a'_i-f_x\)

    把 \(a'\) 向后移动 \(n-x\) 位,前面补 \(n-x-1\) 个 \(0\),第 \(n-x\) 位搞个 \(-1\)

    这样得到的长度为 \(m'+n-x\) 的 \(b\) 再搞个 \(\frac{-delta_i}{delta_x}\) 乘起来就好了

    搞出来的 \(b\) 显然就是我们要求的,但是可能不是最短的

    万物皆可持久化把之前所有求过的 \(a\) 全部记录下来

    (其实记录那个最短的系数就好了)

    然后又搞个 \(fail_i\) 表示第 \(i\) 个 \(a\) 挂了的位置

    最后弄个变量记录一下最短的就好了

代码

可能是对的

可以去 zzq 的博客里面搞个数据测一下正确性

# include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int maxn(3005);
const int mod(1e9 + 7); inline void Inc(int &x, int y) {
x = x + y >= mod ? x + y - mod : x + y;
} inline void Dec(int &x, int y) {
x = x - y < 0 ? x - y + mod : x - y;
} inline int Add(int x, int y) {
return x + y >= mod ? x + y - mod : x + y;
} inline int Sub(int x, int y) {
return x - y < 0 ? x - y + mod : x - y;
} inline int Pow(ll x, int y) {
register ll ret = 1;
for (; y; y >>= 1, x = x * x % mod)
if (y & 1) ret = ret * x % mod;
return ret;
} int n, f[maxn], dt[maxn], fail[maxn], cnt, inv, mn;
vector <int> cur, now, mncoef; int main() {
freopen("BM-in.txt", "r", stdin);
register int i, j, l;
scanf("%d", &n), mn = 0;
for (i = 1; i <= n; ++i) scanf("%d", &f[i]);
for (i = 1; i <= n; ++i) {
dt[i] = mod - f[i], l = now.size();
for (j = 0; j < l; ++j) Inc(dt[i], (ll)f[i - j - 1] * now[j] % mod);
if (!dt[i]) continue;
fail[cnt] = i;
if (!cnt) {
now.clear(), now.resize(i), ++cnt;
continue;
}
inv = mod - (ll)dt[i] * Pow(dt[fail[mn]], mod - 2) % mod, l = mncoef.size();
cur.clear(), cur.resize(i - fail[mn] - 1), cur.push_back(mod - inv);
for (j = 0; j < l; ++j) cur.push_back((ll)inv * mncoef[j] % mod);
if (now.size() > cur.size()) cur.resize(now.size());
for (l = now.size(), j = 0; j < l; ++j) Inc(cur[j], now[j]);
if (now.size() - i < mncoef.size() - fail[mn]) mn = cnt, mncoef = now;
now = cur, ++cnt;
}
cout << cur.size() << endl;
return 0;
}

Berlekamp-Massey算法的更多相关文章

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

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

  2. 【hdu 6172】Array Challenge(数列、找规律)

    多校10 1002 HDU 6172 Array Challenge 题意 There's an array that is generated by following rule. \(h_0=2, ...

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

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

  4. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

  5. 分布式系列文章——Paxos算法原理与推导

    Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...

  6. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  7. 红黑树——算法导论(15)

    1. 什么是红黑树 (1) 简介     上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...

  8. 散列表(hash table)——算法导论(13)

    1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...

  9. 虚拟dom与diff算法 分析

    好文集合: 深入浅出React(四):虚拟DOM Diff算法解析 全面理解虚拟DOM,实现虚拟DOM

  10. 简单有效的kmp算法

    以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...

随机推荐

  1. 2016级算法第六次上机-A.Bamboo之寻找小金刚

    Bamboo之寻找小金刚 分析 可以抽象为许多连续线段,分别计数左拐和右拐的个数.考察叉积的基础应用. 假设ABC三点构成一个夹角∠ABC,B就是拐点,AC是辅助形成夹角.考虑线段AB和BC形成的向量 ...

  2. 【Alpha】任务分解与分配

    Alpha阶段总体任务规划 Alpha阶段我们的任务主要是恢复原先项目的代码运行,并增加一部分物理实验(二)的内容以及完善之前项目未完成的功能,例如后台管理及用户管理界面.在恢复项目部分的主要工作是将 ...

  3. 最小生成树--牛客练习赛43-C

    牛客练习赛43-C 链接: https://ac.nowcoder.com/acm/contest/548/C 来源:牛客网 题目描述 ​ 立华奏是一个刚刚开始学习 OI 的萌新. 最近,实力强大的 ...

  4. sql server 2008 R2 配置管理工具打不开

    使用 sql server 配置管理工具是报如下错误: 解决方法:   1 找出 sqlmgmproviderxpsp2up.mof 这个文件的位置   2 以管理员身份运行 mofcomp &quo ...

  5. ubuntu安装ntp时间服务器

    1.安装ntp软件 sudo apt-get install ntp2.修改配置文件      sudo vim /etc/ntp.conf driftfile /var/lib/ntp/ntp.dr ...

  6. PHP之string之str_pad()函数使用

    str_pad (PHP 4 >= 4.0.1, PHP 5, PHP 7) str_pad - Pad a string to a certain length with another st ...

  7. 文本相似度分析(基于jieba和gensim)

    基础概念 本文在进行文本相似度分析过程分为以下几个部分进行, 文本分词 语料库制作 算法训练 结果预测 分析过程主要用两个包来实现jieba,gensim jieba:主要实现分词过程 gensim: ...

  8. Hudson-ci/Installing Hudson Windows Service---官方文档

    < Hudson-ci Hudson Continuous Integration Server Website Download Community Mailing List • Forums ...

  9. [转载]Vue 2.x 实战之后台管理系统开发(一)

    2. 开发前须知 我的后台管理系统项目运用了如下框架/插件: Vue 2.x —— 项目所使用的 js 框架,我所使用的版本是:2.1.10 vue-router 2 —— Vue 2.x 配套路由, ...

  10. 深度为君剖析CTO、技术总监、首席架构师的区别

      CTO.技术总监.首席架构师的区别 经常有创业公司老板来拜访我,常常会拜托给我一句话:帮我找一个CTO. 我解释的多了,所以想把这个写下来,看看你到底需要的应该是啥. 一.高级程序员 如果你是一个 ...