BM求线性递推式(板子整理)

BM算法(Berlekamp-Massey算法):解决线性递推问题 算法内容 Berlekamp-Massey算法,常简称为BM算法,是用来求解一个数列的最短线性递推式的算法。 BM算法可以在O(N2)的时间内求解一个长度为N的数列的最短线性递推式。 算法模板 取模,模数为质数 #include<bits/stdc++.h> using namespace std; #define rep(i,a,n) for(int i=a;i<n;i... 阅读详情

心得

杜老师的奇技淫巧,绝大多数不懂原理,但只要套板子就行了

板子整理

以2019牛客多校B题为例,求出dp[0]到dp[2*k]塞入名为ans的vector

要求第n项时,直接linear_seq::(gao,n)即可,

如果不放第0项的话,就是linear_seq::(gao,n-1)

对于an=an-1+an-2+an-3这种依赖项为3项的线性递推式,似乎至少要塞入6项

常用于矩阵快速幂的dp线性递推式的问题

#include<bits/stdc++.h>
 
using namespace std;

typedef long long ll;

const ll mod=1e9+7;
const int N=1024;

ll modpow(ll a,ll b,ll mod) {ll res=1;a%=mod; for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll inv(ll x){return modpow(x,mod-2,mod);}

namespace linear_seq {
	#define rep(i,a,n) for (int i=a;i<n;i++)
	#define per(i,a,n) for (int i=n-1;i>=a;i--)	
	#define pb push_back
	#define mp make_pair
	#define all(x) (x).begin(),(x).end()
	#define fi first
	#define se second
	#define SZ(x) ((int)(x).size())
	typedef vector<int> VI;
	typedef pair<int,int> PII;
	typedef long long ll;
	const ll mod=1e9+7;
    const int N=10010;
    ll res[N],base[N],_c[N],_md[N];
 	ll modpow(ll a,ll b,ll mod) {ll res=1;a%=mod; for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
    vector<int> Md;
    void mul(ll *a,ll *b,int k) {
        rep(i,0,k+k) _c[i]=0;
        rep(i,0,k) if (a[i]) rep(j,0,k) _c[i+j]=(_c[i+j]+a[i]*b[j])%mod;
        for (int i=k+k-1;i>=k;i--) if (_c[i])
            rep(j,0,SZ(Md)) _c[i-k+Md[j]]=(_c[i-k+Md[j]]-_c[i]*_md[Md[j]])%mod;
        rep(i,0,k) a[i]=_c[i];
    }
    int solve(ll n,VI a,VI b) { // a 系数 b 初值 b[n+1]=a[0]*b[n]+...
//        printf("%d\n",SZ(b));
        ll ans=0,pnt=0;
        int k=SZ(a);
       // assert(SZ(a)==SZ(b));
        rep(i,0,k) _md[k-1-i]=-a[i];_md[k]=1;
        Md.clear();
        rep(i,0,k) if (_md[i]!=0) Md.push_back(i);
        rep(i,0,k) res[i]=base[i]=0;
        res[0]=1;
        while ((1ll<<pnt)<=n) pnt++;
        for (int p=pnt;p>=0;p--) {
            mul(res,res,k);
            if ((n>>p)&1) {
                for (int i=k-1;i>=0;i--) res[i+1]=res[i];res[0]=0;
                rep(j,0,SZ(Md)) res[Md[j]]=(res[Md[j]]-res[k]*_md[Md[j]])%mod;
            }
        }
        rep(i,0,k) ans=(ans+res[i]*b[i])%mod;
        if (ans<0) ans+=mod;
        return ans;
    }
    VI BM(VI s) {
        VI C(1,1),B(1,1);
        int L=0,m=1,b=1;
        rep(n,0,SZ(s)) {
            ll d=0;
            rep(i,0,L+1) d=(d+(ll)C[i]*s[n-i])%mod;
            if (d==0) ++m;
            else if (2*L<=n) {
                VI T=C;
                ll c=mod-d*modpow(b,mod-2,mod)%mod;
                while (SZ(C)<SZ(B)+m) C.pb(0);
                rep(i,0,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod;
                L=n+1-L; B=T; b=d; m=1;
            } else {
                ll c=mod-d*modpow(b,mod-2,mod)%mod;
                while (SZ(C)<SZ(B)+m) C.pb(0);
                rep(i,0,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod;
                ++m;
            }
        }
        return C;
    }
    int gao(VI a,ll n) {
        VI c=BM(a);
        c.erase(c.begin());
        rep(i,0,SZ(c)) c[i]=(mod-c[i])%mod;
        return solve(n,c,VI(a.begin(),a.begin()+SZ(c)));
    }
};
vector<int>ans;
ll dp[2*N],p,n;
int t,k;
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%lld",&k,&n);
		if(n==-1)
		{
			printf("%lld\n",2*inv(k+1)%mod);//2/(k-1)
			continue;
		}
		p=inv(k);
		dp[0]=1;//dp[n]=1/k dp[n-1] +1/k dp[n-2]+...+1/k dp[n-k]
		ans.clear();
		ans.push_back(dp[0]); 
		for(int i=1;i<=2*k;++i)
		{
			dp[i]=0;
			for(int j=max(i-k,0);j<i;++j)
			{
				dp[i]=(dp[i]+dp[j])%mod;
			}
			dp[i]=dp[i]*p%mod;//1/k
			ans.push_back(dp[i]); 
		}
		printf("%d\n",linear_seq::gao(ans,n));
	}
	return 0;
}

 

计算线性复杂度 BM算法 BM算法,用于计算序列的线性复杂度及其反馈多项式。使用JAVA实现 立即下载

相关推荐

MATLAB 论文复现——面向紧急需求响应的规模化灵活资源负荷管理快速决策方法

其次,对灵活资源参与EDR的功率分配模型进行了建模,并提出了基于分层分布式共识算法的快速决策方法,对功率分配模型进行快速求解,以满足EDR实时性的需求,在保证较高精度的前提下提高了决策速度。[1]孔祥玉,杨至端,孙裕策,等.面向紧急需求响应的规模化灵活资源负荷管理快速决策方法[J/OL].电力系统自动化,1-13[2024-07-29].http://kns.cnki.net/kcms/detail/32.1180.TP.20240709.1843.002.html.关键词: 规模化灵活资源;

sjr1478的博客 374

【学习笔记】BM算法和线性递推

里面写的东西很不偏向于数竞;不适合喜欢数学公式的同学。

七代目鸽影 6990

关于发那科机器人抓手及物料搬运阀配置

4:确保抓手阀岛和输入模块配网连接正常,MENU—SETUP—MH Valves—Details,详细界面进入到左上图所示,根据每组阀分配夹钳数量并应用。3:设置搬运有效,抓手是否带点焊可以自行选择,要设置应用选择,物料搬用工具数量,工具上阀岛的数量,夹钳存在数量,工具存在数量,以及真空吸盘,冷启动。​2:MENU—应用选择,将搬运置为有效,剩余其他项根据机器人实际用途进行选择。5:设置夹钳数量,检查打开夹钳,检查闭合夹钳,延迟时间要给选择配置应用。

dxs93的博客 4776

杜教BM(解决线性递推式的模板)

把递推式前几项扔进去就行了,至少扔个8项,然后mod根据题意改改,就能出结果了。太神奇了。 #include&lt;bits/stdc++.h&gt; using namespace std; #define rep(i,a,n) for (int i=a;i&lt;n;i++) #define per(i,a,n) for (int i=n-1;i&gt;=a;i--) #define pb...

阿狸的博客 578

设计一个订单管理系统(OMS)系统100问?

一个完善的订单管理系统不仅仅是简单地记录和处理订单信息,更需要考虑到订单的全生命周期管理,包括订单的创建、支付、配送、售后等环节。这100个问题围绕订单管理系统(OMS)的各个方面展开,涵盖了系统的功能、架构、安全性、异常处理、订单处理流程、支付、库存管理、客户管理、报表与分析等多个方面。通过这些问题,可以全面考虑订单管理系统在设计与实现过程中需要考虑的各种因素,从而确保系统能够满足业务需求、具有良好的性能和稳定性,同时易于扩展、维护和管理。

nbsaas-boot基于Request-Response的企业级快速开发框架 1384

CKAD-CN 考试知识点分享(2) CronJob

成功创建 CronJobppi,每 5 分钟执行一次计算任务;配置了和;设置,超时自动终止;确保 Pod 不重启;手动创建ppi-testJob 验证功能正常;所有任务要求均已满足。

轻的博客 331

【学习笔记】Berlekamp-Massey算法

【算法简介】Berlekamp-Massey算法,常简称为BM算法,是用来求解一个数列的最短线性递推式的算法。BM算法可以在\(O(N^2)\)的时间内求解一个长度为\(N\)的数列的最短线性递推式。在当今OI竞赛界,尚没有很多BM算法的应用,但在一些输入的数很少的题目中,BM能够成为发掘题目性质的一大助力,甚至有可能直接解出答案的线性递推式,不失为一种不错的工具。【算法流程】对于数列\(\{a_...

cz_xuyixuan的博客 2万+

不带DDR的ZYNQ使用OCM加载程序运行的方法

软件版本:Vivado Vitis2019.2 第一步: 在Vivado的ZYNQ Block Design时候不配置DDR 第二步: 在Vitis中: 1、 在Vitis中新建Platform,选择xsa文件: 2、 在xparameters.h中添加DDR的地址空间定义,如下: 3、 修改链接文件,修改每个段都到ram_0,因为ram_1空间全部给到应用程序 4、 修改fsbl工程的main.c,增加XPAR_PS7_DDR_0条件编译 5、 修改fsbl.h,重定义DDR_EN

hpf247的博客 5535

BM求线性递推式

只能解决常系数线性递推式 要求数域中每个的非0数存在乘法逆元 #include&lt;bits/stdc++.h&gt; using namespace std; #define rep(i,a,n) for (int i=a;i&lt;n;i++) #define pb push_back #define mp make_pair #define SZ(x) ((int)(x).size(...

蒟蒻 lxw的博客 1650

三菱FX3U PLC红绿灯ST编程实战:从基础逻辑到急停功能完整实现

本文以十字路口红绿灯控制为例,详细讲解了三菱FX3U PLC使用ST编程的完整实战过程。内容涵盖从基础时序逻辑、状态机设计,到急停功能、黄灯闪烁、昼夜模式切换等高级功能的实现,并提供了代码优化与调试技巧,帮助工程师掌握结构化文本在工业控制中的清晰、结构化应用。

weixin_29070861的博客 533

ML.NET在工业上位机中的深度应用:如何用C#实现10ms级预测推理?

模型要“够用就好”:工业场景的规律往往不复杂,别迷信深度学习,FastTree、线性模型足够应付80%的场景,且速度快3-5倍;预处理“能省就省”:离线做90%的特征工程,实时只处理动态变化的10%,这是突破10ms的关键;代码“贴近硬件”:用struct、数组池、SIMD等“非托管技巧”写C#,避免GC成为实时性瓶颈;测试“模拟极端”:在目标工控机上用100%负载(同时跑PLC通信、运动控制、视觉检测)测试推理延迟,确保极端情况下仍达标。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 743

常系数齐次线性递推(知识总结+板子整理)

心得 其实挑战上提了一句这个,只滚系数是O(k²logn)的,但是一直不会实现 今天终于把代码啃下来了,以后带着板子抄就可以了…… 适用于dp递推式,O(k³logn)矩阵快速幂超时的场合, 可O(k²)的BM求线性递推式或O(k²logn)的系数矩阵快速幂 思路来源 https://ac.nowcoder.com/acm/contest/view-submission?submiss...

小衣同学的博客 887

UCIE Specification详解(十一)

Electrical Layer (2D and 2.5D)以及UCIe-3D

Crazzy_M的博客 1196

[模板]BM求线性递推式

要求第n项时,直接linear_seq::(gao,n)即可, 不放第0项的话,就是linear_seq::(gao,n-1) #include<bits/stdc++.h> using namespace std; typedef long long ll; const ll mod=1e9+7; const int N=1024; ll modpow(ll a...

Zeolim的博客 293

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

最短线性递推式 BM算法 Berlekamp-Massey

最短线性递推式

myjs999的博客 2515

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ACM算法总结 线性递推(BM)

BM算法,全称是Berlekamp-Massey算法,给出某个其次的线性递推数列的前面若干项,它可以自动算出这个齐次式,以及计算出后面第 K 项的值。我依然不理解这个算法,这里只是记录一下有这个东西。 代码: const int maxn=40005; const LL M=998244353; struct linear_sequence { LL res[maxn],base[maxn],_c[maxn],_md[maxn]; VI Md; LL ksm(LL x,LL n..

dragonylee的博客 1162

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

BM线性递推

如果一个数列、其能够通过线性递推而来: 例如使用矩阵快速幂优化的 DP 大概都可以丢进去 则使用 BM 即可得到任意 N 项的数列元素 模板: #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector&g...

Jiandong 1177

CCF201809-5线性递推式

试题编号: 201809-5 试题名称: 线性递推式 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 样例输入 3 3 6 2 0 4 样例输出 12 32 80 208 样例说明 样例输入 2 1 11 1 1 样例输出 ...

fyy_lufan的博客 5478

BM线性递推模板【黑科技】

#include &lt;cstdio&gt; #include &lt;cstring&gt; #include &lt;cmath&gt; #include &lt;algorithm&gt; #include &lt;vector&gt; #include &lt;string&gt; #include &lt;map&gt; #include &lt;set&gt; #i

running_acmer的博客 1200

杜教的板子(递推求值)

#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <string> #include <map> #include <set> #include <cassert> using namespace std; #define rep(i,a,n) f

记一笔、三三两两 715

最短线性递推式 BM算法板子

#include<bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pb push_back #define m...

gebixiaofang的博客 354

递推式模板(黑科技)

有一个递推式的模板,你给的值越多,递推式得出的结果越准确 据说是杜教的模板#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <string> #include <map> #include <set> #include <cassert> usi

yqdjl6的博客 1704

杜教BM线性递推自动化模板

这是一个超厉害的模板,功能是输入前几项,能够自动推导公式                                         前提:公式必须是线性的,前几项越多越好,一般不低于8项,不然推出来不准确。                                         原理:暂时没搞清楚,听说是利用矩阵来推导。 #include &lt;cstdio&gt; #in...

PleasantlY1的博客 892

线性递推式模板

写这篇博客保存一下这个强无敌的模板,可以解决任何线性递推式。这个板子是杜教的板子。所以我们现在要做的是用推出递推式的前几项,然后扔进这个板子就可以了。前几项丢的越多越好, 一般8个是绝对可以推出来的,个别的少一点也行。 模板: #include &lt;cstdio&gt; #include &lt;cstring&gt; #include &lt;cmath&gt; #include &l...

常胜将军的博客 1698

线性递推式

试题编号: 201809-5 试题名称: 线性递推式 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 样例输入 3 3 6 2 0 4 样例输出 12 32 80 208 样例说明 样例输入 2 1 11 1 1 样例输出 1 2 3 5 8 13 21 34 55 89 144 样例说明 样例输入 10 10 20 532737790 634932889 335818534 101179174 977780682 695192541 779962395 295668292 1576612

Gedulding的博客 853

线性递推式模板 hdu6198为例

今天打2017沈阳网络赛的时候,第五题好像是个找规律的题(因为我好像找出规律了,但是没写),队友直接一个模版,把我推出的前几项放进去后直接就可以把后面的弄出来。。。太强了写这篇博客保存一下这个强无敌的模板,可以解决任何线性递推式.。这个板子是我一个学长从百度之星复赛上扒的杜教的板子。所以我们现在要做的是用推出递推式的前几项.,然后扔进这个板子就可以了。mod换成题目的就OK,前几项丢的越多越好, 一

WilliamSun0122的博客 2438
上一篇: Codeforces Round #585 (Div. 2) E - Marbles(状压dp)
下一篇: Codeforces Round #374 (Div. 2) C. Journey(dp)
小衣同学
博客等级 码龄9年 1444粉丝 995原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值