\(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. Ubuntu下解决apt update时签名无效问题

    Ubuntu 18.04在执行apt-get update时出现一下报错: W: GPG 错误:http://repo.mysql.com/apt/ubuntu bionic InRelease: 下 ...

  2. SPI 用户空间的读写操作

    spi_device 虽然用户空间不需要直接用到spi_device结构体,但是这个结构体和用户空间的程序有密切的关系,理解它的成员有助于理解SPI设备节点的IOCTL命令,所以首先来介绍它.在内核中 ...

  3. Oracle数据库学习(四):学习中的遇到的问题

    一.xhost图形化界面安装问题 问题1:运行xhost +命令,出现命令没有找到错误 原因:Linux系统没有安装xhost图形化包. 解决办法:安装xhost图形化包,命令如下: yum what ...

  4. Powershell cannot be loaded because running scripts is disabled on this system 解决办法

    问题背景 第一次跑ps时,出现了下面的提示.这是因为windows不允许执行脚本而已,不要大惊小怪. 解决办法 这个需要管理员执行,不然会出现以下的情况 正常情况

  5. 8. JavaScript学习笔记——事件

    8. 事件 8.1 事件基础 /// 事件就是用户或浏览器自身执行的某种动作.诸如 click.load 和 mouseover,都是事件的名字.而响应某个事件的函数就叫做事件处理程序(或事件侦听器) ...

  6. C# openfiledialog的使用

    文件对话框(FileDialog) 一.打开文件对话框(OpenFileDialog) 1. OpenFileDialog控件有以下基本属性 InitialDirectory 对话框的初始目录Filt ...

  7. JS中typeof和instanceof的用法和区别

    typeof和instanceof的区别 instanceof 常用来判断一个变量是否为空,或者是什么类型的.但它们之间还是有区别的 instanceof的用法 instanceof返回的是一个布尔值 ...

  8. 使用VNC访问Windows桌面

    1. 背景介绍 两台电脑,一个笔记本,一个台式机 笔记本上装的是Windows 10, 通过上网小助手上网 (P.S.  上网小助手...Stupid Policy...) 台式机上装的是Ubuntu ...

  9. SQL性能调优

    部分转自:http://www.cnblogs.com/luckybird/archive/2012/06/11/2544753.html 及http://www.cnblogs.com/kissdo ...

  10. weblogic 异常常见处理方法

    1.系统日志 通过分析weblogic的系统日志及应用程序出错的地方,可能找到异常的原因. 2. 数据库连接 如果用户访问系统过慢,且连接池已经占满而weblogic的线程数量很少,就要查看应用是否没 ...