用于求数列的最短递推式。

本文参考自 https://www.cnblogs.com/jz-597/p/14983564.html。

增量法,设 RiR_iRi​ 表示第 iii 个历史递推式,当前为 RcntR_{cnt}Rcnt​。

设 Δ\DeltaΔ 表示真实的 aia_iai​ 与用 RcntR_{cnt}Rcnt​ 求出的 aia_iai​ 的差值,即 Δ=ai−∑j=1∣Rcnt∣ai−jRcnt,j\Delta=a_i-\sum_{j=1}^{|R_{cnt}|}a_{i-j}R_{cnt,j}Δ=ai​−∑j=1∣Rcnt​∣​ai−j​Rcnt,j​。

  • 若 Δ=0\Delta=0Δ=0,则无事发生,跳过。
  • 若 Δ≠0\Delta\neq 0Δ​=0,那么我们需要调整这个递推式使得它对 aia_iai​ 也成立。

接下来看第二种情况怎么处理。

有一个想法是找到另一个递推式,使得这个递推式在算 ⋯,ai−1\cdots,a_{i-1}⋯,ai−1​ 时取 000,在算 aia_iai​ 时取 Δ\DeltaΔ。

我们可以找到一个历史递推式 RlstR_{lst}Rlst​,设其失配位置为 faillstfail_{lst}faillst​,失配时的差值为 Δlst\Delta_{lst}Δlst​(显然 Δlst≠0\Delta_{lst}\neq 0Δlst​​=0)。

设 d=ΔΔlstd=\dfrac{\Delta}{\Delta_{lst}}d=Δlst​Δ​,那么我们可以找到这么一个递推式 R′={0,0,⋯,0,d,−d⋅Rlst,1,−d⋅Rlst,2,⋯}R'=\{0,0,\cdots,0,d,-d\cdot R_{lst,1},-d\cdot R_{lst,2},\cdots\}R′={0,0,⋯,0,d,−d⋅Rlst,1​,−d⋅Rlst,2​,⋯},其中前面是 i−faillst−1i-fail_{lst}-1i−faillst​−1 个 000。

可以发现,使用这个递推式得到的 ai′=∑j=1∣R′∣Rj′ai−j=d(afaillst−∑j=1∣Rlst∣Rlst,jafaillst−j)=d⋅Δlst=Δa_i'=\sum_{j=1}^{|R'|}R'_{j}a_{i-j}=d(a_{fail_{lst}}-\sum_{j=1}^{|R_{lst}|}R_{lst,j}a_{fail_{lst}-j})=d\cdot \Delta_{lst}=\Deltaai′​=∑j=1∣R′∣​Rj′​ai−j​=d(afaillst​​−∑j=1∣Rlst​∣​Rlst,j​afaillst​−j​)=d⋅Δlst​=Δ。

而对于任意 (i−k)∈[∣R′∣+1,i−1](i-k)\in [|R'|+1,i-1](i−k)∈[∣R′∣+1,i−1],ai−k′=∑j=1∣R′∣Rj′a(i−k)−j=d(afaillst−k−∑j=1∣Rlst∣Rlst,ja(faillst−k)−j)=0a_{i-k}'=\sum_{j=1}^{|R'|}R'_j{a_{(i-k)-j}}=d(a_{fail_{lst}-k}-\sum_{j=1}^{|R_{lst}|}R_{lst,j}a_{(fail_{lst}-k)-j})=0ai−k′​=∑j=1∣R′∣​Rj′​a(i−k)−j​=d(afaillst​−k​−∑j=1∣Rlst​∣​Rlst,j​a(faillst​−k)−j​)=0。

那么我们令 Rcnt+1←Rcnt+R′R_{cnt+1}\gets R_{cnt}+R'Rcnt+1​←Rcnt​+R′ 即可。

实质上是利用了以前的信息 RlstR_{lst}Rlst​:注意到失配前的差值都是 000,所以我们用差值来定义递推式。

那么我们怎么找到最短的 R′R'R′ 呢?由于 ∣R′∣=i+(∣Rlst∣−faillst)|R'|=i+\big(|R_{lst}|-fail_{lst}\big)∣R′∣=i+(∣Rlst​∣−faillst​),所以我们直接找 ∣Rlst∣−faillst|R_{lst}|-fail_{lst}∣Rlst​∣−faillst​ 最小的就好了。

至于为什么求出来的递推式一定是最短的不会证。

【XSY3403】求数列的最短递推式 代码:

#include<bits/stdc++.h>#define N 10010using namespace std;namespace modular
{const int mod=1000000007;inline int add(int x,int y){return x+y>=mod?x+y-mod:x+y;}inline int dec(int x,int y){return x-y<0?x-y+mod:x-y;}inline int mul(int x,int y){return 1ll*x*y%mod;}inline void Add(int &x,int y){x=x+y>=mod?x+y-mod:x+y;}
}using namespace modular;inline int poww(int a,int b)
{int ans=1;while(b){if(b&1) ans=mul(ans,a);a=mul(a,a);b>>=1;}return ans;
}inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^'0');ch=getchar();}return x*f;
}int n,a[N],delta[N],fail[N];vector<int>r[N];int main()
{n=read();for(int i=1;i<=n;i++) a[i]=read();int cnt=0,lst=cnt;for(int i=1;i<=n;i++){delta[cnt]=0;for(int j=0;j<r[cnt].size();j++)Add(delta[cnt],mul(r[cnt][j],a[i-j-1]));delta[cnt]=dec(a[i],delta[cnt]);if(!delta[cnt]) continue;fail[cnt]=i;if(!cnt){r[++cnt].resize(i);continue;}r[cnt+1]=r[cnt];r[cnt+1].resize(max((int)r[cnt+1].size(),i+(int)r[lst].size()-fail[lst]));int d=mul(delta[cnt],poww(delta[lst],mod-2));Add(r[cnt+1][i-fail[lst]-1],d);for(int j=0;j<r[lst].size();j++)Add(r[cnt+1][i-fail[lst]+j],mul(dec(0,d),r[lst][j]));if((int)r[cnt].size()-fail[cnt]<(int)r[lst].size()-fail[lst]) lst=cnt;cnt++;}printf("%d\n1000000006 ",(int)r[cnt].size());for(int i=0;i<r[cnt].size();i++)cout<<r[cnt][i]<<" \0"[i==r[cnt].size()-1];return 0;
}

Berlekamp-Massey 算法(求数列的最短递推式)相关推荐

  1. 算法分析中递推式的一般代数解法

    算法分析中经常遇到需要求解递推式的情况,即将递推式改写为等价的封闭形式.例如汉诺塔问题的时间复杂度递推形式为T(n)=2T(n−1)+1(n≥1)T(n)=2T(n−1)+1(n≥1),可以解出封闭形 ...

  2. Berlekamp–Massey算法简要介绍

    这是一篇翻译向的文章,笔者整理了一些有关Berlekamp–Massey算法的笔记,还增加了一些自己的理解. 下面列出了笔者写此文时所参考的一些资料: wikipedia fjzzq2002 别人的博 ...

  3. 2019蓝桥杯A组:数列求值(递推式)

    三.题目:数列求值 给定数列 1, 1, 1, 3, 5, 9, 17, -,从第 4 项开始,每项都是前 3 项的和.求 第 20190324 项的最后 4 位数字. [答案提交] 这是一道结果填空 ...

  4. 特征方程求数列的通项公式(二阶线性递推式)

    特征方程求数列的通项公式(二阶线性递推式) 已知数列{an}\{a_n\}{an​}满足fn=afn−1+bfn−2,a,b∈N,b≠0,n>2,f1=c1,f2=c2,(c1,c2f_n=af ...

  5. Berlekamp–Massey 算法

    学习博客 学习博客 BM算法用于求解常系数线性递推式. 它可以在 O(n2)O(n^2)O(n2) 的时间复杂度内解决问题. 先打个比赛,一会再更 学习算法看上边的两个学习链接就行,板子可以参考我下边 ...

  6. Berlekamp Massey算法(HDU6172)

    用途:常系数k阶递推式求值 HDU6172 #include <bits/stdc++.h>using namespace std; #define rep(i, a, n) for (l ...

  7. 最短线性递推式求解与有理函数重建

    这一算法来自于我们对"线性递推式拟合"的视角转换,其后得到的算法是自然的. 引理 1. 如果两个有理分式 p1/q1,p2/q2p_1/q_1, p_2/q_2p1​/q1​,p2 ...

  8. BM算法(Berlekamp-Massey算法):解决线性递推问题

    算法内容 Berlekamp-Massey算法,常简称为BM算法,是用来求解一个数列的最短线性递推式的算法. BM算法可以在O(N2)的时间内求解一个长度为N的数列的最短线性递推式. 算法模板 取模, ...

  9. [递推式求解、多指针、前缀和]XATU第七届算法大赛

    文章目录 赛后感想 1.2题略 3 乐华水上梦幻乐园之拖鞋失踪案[概率论.递推式求解] 题意 分析 代码 4.5.6.7.8题略 9 Ugly Number[多指针] 题意 做法1[BFS with ...

最新文章

  1. 吴恩达邀请9位AI大牛畅想2020:李开复看好医疗教育,LeCun强调自监督学习
  2. Git忽略规则及.gitignore规则不生效的解决办法
  3. Struts2+Spring详解
  4. python编译exe文件太大了_python编译windows下可执行的exe文件
  5. 爬虫实例十三 教你怎么用爬虫一次给女朋友拿下28万张情侣头像
  6. redis安装与调优部署文档(Linux)
  7. android 清空剪贴板,清空剪贴板app
  8. 安服/渗透测试面试题(2)
  9. 搭建Terraria服务器[Centos7/LGSM/泰拉瑞亚]
  10. Windows下磁盘配额的使用量问题
  11. 显示商品信息(java web)
  12. 深度学习——深度学习基础概念
  13. 解析json数据 (js , java)
  14. QPSK调制解调过程,包括串并转换,电平转换,载波调制,相干解调,抽样判决等
  15. 刷微博粉丝工具发布及原理解说
  16. 组合保险策略及相应模拟测算工具----Discrete Hedging: Guaranteed CPPI Structures
  17. 浅析伪罗伯特法所构造的任意阶数伪二次幻方中某一任意位置权值的一般求法
  18. 2021-12-22 WPF上位机 116-三菱PLC协议
  19. emui android区别,华为手机为什么有EMUI版本和Android版本?
  20. Ract-Native 调出dev menu的命令

热门文章

  1. iphone关闭系统升级提示
  2. 我们连站都站不好--从Taylor Swift的脖子说起
  3. css 网格布局_CSS网格布局:流体列和更好的装订线
  4. 系统未正确安装新的设备驱动程序后 开机总是出现“欢迎使用找到新硬件向导”...
  5. WPS2021 无法加载此加载项程序 解决办法
  6. python:实现十进制转八进制算法(附完整源码)
  7. 安卓来电、去电非常重要的2个类:CallsManager和IncallService
  8. 【springboot+云计算】B/S医院信息管理系统源码(云HIS)
  9. 根据自己的经历总结一些安卓工程师的面试经验和题目
  10. ag-grid表格基本使用方法-React版本