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

扩展欧几里得算法详解:从原理到模逆元与线性同余方程 在数论与算法竞赛中,求解最大公约数(gcd)是最基础的操作,而扩展欧几里得算法(Exgcd)则更进一步:它能在递归求gcd的同时,构造出二元一次不定方程 ax + by = gcd(a,b) 的一组整数解。这一能力并非锦上添花,而是许多高级数论问题的基石。从原理上看,Exgcd 巧妙地利用递归回溯,将下一层的解逐级换算为当前层的系数,整个过程只需加减乘运算,严谨且高效。其技术价值集中体现在两大高频场景中:一是求模逆元,与费马小定理相比,Exgcd 不要求模数为质数,适用范围更广;二是解线性同余方程,通过三步 阅读详情

心得

其实挑战上提了一句这个,只滚系数是O(k²logn)的,但是一直不会实现

今天终于把代码啃下来了,以后带着板子抄就可以了……

适用于dp递推式,O(k³logn)矩阵快速幂超时的场合,

可O(k²)的BM求线性递推式或O(k²logn)的系数矩阵快速幂

思路来源

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=40893084杜教AC代码

https://wenku.baidu.com/view/bac23be1c8d376eeafaa3111.html(叉姐的论文《线性递推关系与矩阵乘法》)

知识整理

如果a_{k}=c_{0}a_{0}+c_{1}a_{1}+...+c_{k-1}a_{k-1},

那么a_{n}=c_{0}a_{n-k}+c_{1}a_{n-k+1}+...+c_{k-1}a_{n-1},倒着往回推系数,

迟早能推成全是a_{0},a_{1},...,a_{k-1}表示的项,再用对应系数一乘一求和就得到一个an的答案

所以思路就是,若要将an用a_{0},a_{1},...,a_{k-1}表示,

就要分治的将a_{\frac{n}{2}}用a_{0},a_{1},...,a_{k-1}表示,a_{n-\frac{n}{2}}用a_{0},a_{1},...,a_{k-1}表示,

然后a_{\frac{n}{2}}和a_{n-\frac{n}{2}}对应系数一乘乘出a_{0},a_{1},...,a_{2k-2}的系数,

再把a_{k},a_{k+1},...,a_{2k-2}这些项每一个用a_{n}=c_{0}a_{n-k}+c_{1}a_{n-k+1}+...+c_{k-1}a_{n-1}这样的式子,

倒着从a_{2k-2}下放系数,直到所有的系数都是用a_{0},a_{1},...,a_{k-1}表示的为止

由于,第一次构造的是x^{1}的k阶表示,后续不断自乘才得到最高的k阶表示

所以,代码中w和x的作用就是交换高低位,w是不大于n的最大的2的次幂

而当w当前最高位为1时,x当前最低位为1,b是判断现在n中是否有w的这一位

如果有,执行形如x^{5}=(x^{2})^{2}*x^{1},实际操作时把v[i]*v[j]的结果直接加到u[i+j+1]上,

其效果等同于先加到u[i+j]上然后向高一位乘v[1],因为这里v[1]==1恒成立,就省略了

板子整理

以2019牛客暑期多校训练营(第二场)B题.Eddy Walker 2为例

k<=1050,n<=1e18,只能用O(k²)的BM或O(k²logn)的系数矩阵快速幂

#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;++i)
#define mp make_pair
#define pb push_back
#define x0 gtmsub
#define y0 gtmshb
#define x1 gtmjtjl
#define y1 gtmsf
typedef long long ll;
//M为递推项系数个数 c为系数数组
//最终递推式为a[m]=c[0]a[0]+c[1]a[1]+...+c[m-1]a[m-1]  
const int M=1050,P=1000000007;
//求快速幂 只写一个系数即求逆元 
ll pw(ll x,ll y=P-2){
    ll s=1;
    for(;y;y>>=1,x=1ll*x*x%P)
        if(y&1)s=1ll*s*x%P;
    return s;
}
ll i,w,x,b,j,t,a[M],c[M],v[M],u[M<<1],ans;

//推a1...ak每项最终系数的矩阵快速幂 复杂度O(k^2 logn) 
//求a^n的k个a^1 a^k的系数 即求a^(n/2)的k个系数 然后乘在一起变成a^1 到a^(2k)的系数
//然后暴力把a^(k+1)到a^(2k)的系数再倒序下放到a^1 到 a^k上 
ll sol(ll n,ll m) {//求a[n] a[n]来自前m项递推式 
    //scanf("%d%d",&n,&m);
    n+=m-1;//整体右移m-1项 便于0-(m-1)向负的找系数 应为0 
    for(i=m-1;~i;i--)c[i]=pw(m);//c[m-1]到c[0] 每个1/m 相当于x^1  
    for(i=0;i<m-1;i++)a[i]=0;a[m-1]=1;//a[0]-a[m-2]为0 a[m-1]实际为a[0]=0 
    for(i=0;i<m;i++)v[i]=1;//相当于x^0 (v^2)*v推一次即得c
    for(w=!!n,i=n;i>1;i>>=1)w<<=1;//n=0时w=0 n!=0时w>1 w为不大于n的最大2的次幂 
    for(x=0;w;copy(u,u+m,v),w>>=1,x<<=1){//copy把[u,u+m]复制给v 
        fill_n(u,m<<1,0),b=!!(n&w),x|=b;//fill_n 把u.begin()的连续m<<1个位置 都覆盖成0 
        //如果n&w==0 b=0;n&w==w b=1 用两个!把非空判成了1 
        //如果w最高位为1 则x最低位|=1 
        if (x<m)u[x]=1;
        else {
        	//如果b==1 说明应u[i+j+1]+=v[i]*v[j] 这里v[1]==1 故省略 
        	//b==1时 直接向高1位加系数 就起到了先向u[i+j]加系数 再整体移到了u[i+j+1]这一位的作用  
			//类似快速幂的x^(2n+1)=x^(n)*x^(n)*x^1 
			//每次无论遇到0还是1 都有一个自乘左移的过程 所以要最高位第一次考虑 以此类推 
            for(i=0;i<m;i++)for(j=0,t=i+b;j<m;j++,t++)u[t]=((ll)v[i]*v[j]+u[t])%P;
            for(i=(m<<1)-1;i>=m;i--)for(j=0,t=i-m;j<m;j++,t++)u[t]=((ll)c[j]*u[i]+u[t])%P;//从2k-1到k 下放系数到k-1到0
			//注意u[2m-1]=c[0]*u[m-1]+...+c[m-1]*u[2m-2] 每个u[2m-1]的值v可以给u[m-1]下放v*c[0] 
        }
    }
    ans=0;
    for(i=0;i<m;i++)ans=(1ll*v[i]*a[i]+ans)%P;//推成前m阶系数 第i个系数是v[i] 值为a[i] 
    return ans;
}
int T,k;
ll n;
int main()
{
    for(scanf("%d",&T);T--;)
	{
        scanf("%d%lld",&k,&n);
        if(n==-1)printf("%lld\n",2ll*pw(k+1)%P);
        else printf("%lld\n",sol(n,k)%P);//
    }
    return 0;
}

 

【数字逻辑电路课程设计】多功能数码管时钟VHDL+quartus II-EP1C12F324C8+源码+付费资源 我希望需要我这篇文章的是正常学习数字逻辑课程且正在设计数码管时钟的同学。我个人不推荐直接获取源代码,因此我另有一份付费资源是完整源代码;我推荐各位去研究我代码的逻辑尝试自己书写属于自己的代码,因此我保留了注释但隐去了变量。由于时间有限,我的设计不够完美,仍有很多缺陷,我将我的展望写在后面,各位可以尝试实现。我不为难同学,作为同学我理解各位设计的辛苦,因此如果有需要,私信我提供隐去敏感信息的学生证照片可直接获取源代码。 阅读详情

相关推荐

深入解析 TDA4VM/VH R5F 核中断机制:VIC 与非 VIC 模式下的实战对比与优化

本文深入解析了TI TDA4VM/VH平台中ARMv7-R架构R5F核的两种中断处理机制:VIC模式与非VIC模式。通过对比硬件自动跳转与软件向量表分发的核心流程、实战代码示例及性能差异,为开发者提供了基于实时性、灵活性与调试需求的选择指南和优化建议,帮助构建更稳定的嵌入式系统。

weixin_29159441的博客 99

「学习笔记」常系数齐次线性递推

目录 前置知识 矩阵的运算 矩阵加法 矩阵乘法 向量的特殊说明 问题引入 一般方法 暴力递推 矩阵快速幂 对于矩阵快速幂的一些优化 ...

MachineryCountry的博客 759

5分钟搞定!用FunASR在本地快速部署达摩院Paraformer语音识别模型

本文提供了一份快速部署指南,教你如何在5分钟内利用FunASR工具包在本地电脑上启动达摩院Paraformer语音识别模型。Paraformer作为一款非自回归端到端模型,以其推理速度快、识别精度高的特点,结合FunASR的一键式模型加载和统一API,让开发者能轻松构建本地语音识别系统,极大降低了前沿AI技术的应用门槛。

q9w8e7r6t5的博客 605

【多项式】常系数齐次线性递推

TIP:这篇文章只是快速入门,并不包含更加详细的内容 Description 求以下递推式第n项: fi=∑j=1mcjfi−jf_i=\sum_{j=1}^mc_jf_{i-j}fi​=j=1∑m​cj​fi−j​ 其中cjc_jcj​为常数, 形如这样的式子叫做:常系数齐次线性递推, 接下来我们将讨论,当m较小,n很大时,如何快速求出答案 前置技能 先介绍一些必要的东西: 若对于m阶矩阵A...

1404

六轴机械臂正逆解计算

机械臂运动学就是。包括(Forward Kinematics)和(InverseKinematics)两部分。正运动学就是逆运动学则是关节变量->机械臂末端执行器的姿势=正向运动学机械臂未端执行器的位姿->关节变量=逆向运动学。

gaoxiaochan的博客 1万+

混合开关电容DCDC变换器技术解析与工程应用指南

在电源设计领域,传统DCDC变换器在高降压比或高升压比场景下,往往面临占空比过窄、开关应力大、效率偏低等瓶颈。开关电容变换器虽能实现固定比例的电压变换,却受限于调节能力。混合开关电容DCDC变换器通过“开关电容网络粗调变比+电感式DCDC细调输出”的策略,兼顾高效率、高功率密度与宽调压范围。本文梳理了其典型拓扑(如2:1/4:1 SC+Buck)、关键对比、控制策略(含软充电)及工程应用中的常见问题,帮助电源工程师在服务器供电、快充、车载电源等场景下快速选型与调试。

weixin_29164185的博客 314

【组合数学】递推方程 ( 常系数线性齐次递推方程 | 常系数、线性、齐次 概念说明 | 常系数线性齐次递推方程公式解法 | 特征根 | 通解 | 特解 )

一、常系数线性齐次递推方程 、 二、常系数、线性、齐次 概念说明 、 三、常系数线性齐次递推方程公式解法 、 四、常系数线性齐次递推方程公式解法内容概要 、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 6267

基因的富集分析

通过RNA_seq差异表达分析等获得一组基因,想要进一步了解这些基因可能参与哪些生物学过程,具有哪些功能,一般就会用到基因的富集分析了。现在小麦基因注释信息已经可以获得,目前来看包括两套。一个是TGACv1,另一个就是IWGSC1.0。需要用到一个叫“clusterProfiler”的R包。下面用到的数据集来自TGACv1。1、安装source("https://bioconductor.org/b

xxxxx 1万+

【离散数学和组合数学】常系数线性齐次递推关系与常系数线性非齐次递推关系的求解

常系数线性与常系数线性非齐次递推关关系的求解

m0_62135915的博客 2741

2025华为OD面试手撕代码真题目录、八股文真题目录以及面试技巧

1. **华为OD面试技术面准备指南** 2. **华为OD面试技术面常见问题解答** 3. **华为OD面试技术面经验分享** 4. **华为OD面试技术面注意事项** 5. **华为OD面试技术面攻略** 6. **华为OD面试技术面模拟题目与解析** 7. **华为OD面试技术面知识点梳理** 8. **华为OD面试技术面常考**

算法大师! 3万+

python全栈入门到实战【基础篇 02】环境搭建:Python解释器与PyCharm、VSCode编辑器安装配置详解

本文详解Python环境搭建步骤。首先安装解释器(运行代码核心),需从官网下载,选3.8及以上版本(勿选2.x)。Windows安装必勾“Add Python.exe to PATH”,验证用`python --version`;Mac选universal2安装包,验证用`python3 --version`。 编辑器二选一:PyCharm社区版(免费,新手推荐),安装后需配置解释器路径;VSCode轻量,需装Python插件并选择解释器。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 5万+

【模板】常系数齐次线性递推

我们可以列出如下过程:fib5=fib4+fib3=2fib3+fib2=3fib2+2fib1=5fib1+3fib0fib5​=fib4​+fib3​=2fib3​+fib2​=3fib2​+2fib1​=5fib1​+3fib0​。我们设aRaR为多项式aa的反转(第ll项和第00项互换,第l−1l−1项和第11项互换,以此类推),易得aR≡pRqR mod xl−k+1aR≡pRqRmodxl−k+1。那么需要解决的问题变为快速求一个l=2k−2l=2k−2次多项式对一个kk次多项式取模的结果。

dingjiapeng1234的博客 1004

RK3588平台开发系列讲解(以太网篇)MDIO底层驱动

沉淀、分享、成长,让自己和他人都能有所收获!😄。

内核笔记 6885

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

心得 杜老师的奇技淫巧,绝大多数不懂原理,但只要套板子就行了 板子整理 以2019牛客多校B题为例,求出dp[0]到dp[2*k]塞入名为ans的vector 要求第n项时,直接linear_seq::(gao,n)即可, 如果不放第0项的话,就是linear_seq::(gao,n-1) 一般暴力打表7-8项保证绝对正确即可,不放心的话可以多打几项 常用于矩阵快速幂的dp线性递推式...

小衣同学的博客 685

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ACM竞赛板子

文章目录数学欧拉筛(线性筛) 自己的板子积累,不断更新中 数学 欧拉筛(线性筛) 时间复杂度O(n) void prime(int n) { for(int i=2; i<=n; i++) { if(!st[i]) p[ans++]=i; for(int j=0; p[j]<=n/i; j++) { st[p[j]*i]=1; if(i%p[j]==0) break; } } } ......

qq_45769627的博客 3291

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

一些关于ACM板子笔记

我是菜鸟ACMer(qwq),之前整理一些板子笔记,适合刚起步的小白,容易看懂,不过没有很完整,因为没写完就退役了,可以看看目录有哪些知识点噢。

lwltql的博客 2118

EI 的第二代多项式板子整体架构理念

这是一次将多项式模板的易用性与高效性结合的尝试。进度见此 pastebin 怎样有易用性? 封装,用一个 vector&lt;int&gt; 来存多项式,重载各种运算,特点是用的时候比较轻松,但本身的特性导致效率必然不能达到最优。 大概开放形如这样的接口: struct Poly { Poly(const vector&lt;int&gt;&amp; v); // init by vector...

Entropy Increaser 的博客 1976

一锅大杂烩——各种数论の板子

ATP想吃栗子

ADP+Pi==ATP 1336

求逆元的几种方法(1.扩展欧几里得 2.费马小定理 3.逆元线性筛法)以及费马小定理的几种应用

在上个星期做了武大的网络赛以后,看到了逆元的这个知识点,于是决定整理一下,dalao们的文章已经很多了,现在给自己看一下也当作复习吧:呜呜呜咕咕咕,好了正题开始: 1.首先是我最先接触的用费马小定理求解的,这个在我的上一篇博客 (WHU 校赛2019 D题Dandelion的补题以及相关的知识点整理)里面就有关于这个的解法,但是为了自己好复习,就在这里把代码的板子简单的写一下吧: cons...

qq_43460290的博客 586

【乘法逆元】

讲解乘法逆元用,配有几道基础题食用

ygmjsjdboy的博客 1140

noip数论复习总结

(上不了p站我要死了,侵权度娘背锅)勉勉强强算是把数论复习的差不多了。 总结一下吧。其实数论的知识大部分是结合在一起的,勉强分类总结组合数求法组合数的求法根据不同情况选用不同的方法 2、3都是建立在模数为质数的基础上,而1、4适用于任何情况(数据范围内)。4的详细做法点这里。 另外,阶乘的逆元可以o(n)求,以前一直用的o(nlogn)的。。具体做法点这里。卡特兰数算是一种组合数的特殊运用

LinnBlanc的博客 814

算法题知识点总结与代码模板

一次整理总结

xxwl585的博客 238

莫比乌斯反演与Min_25筛:解决超大范围数论函数求和的终极指南

在算法竞赛和高性能计算中,处理数论函数的前缀和是一个经典问题。其核心原理在于利用积性函数的性质,通过狄利克雷卷积或莫比乌斯反演,将复杂的求和式转化为更易处理的形式。这项技术的核心价值在于,它能将看似O(n)的暴力计算,优化至O(sqrt(n))甚至亚线性复杂度,从而应对高达1e10乃至更大的数据规模。在实际应用场景中,如密码学、组合数学和分布式计算,快速计算欧拉函数、除数函数等的前缀和至关重要。本文聚焦于解决此类问题的两大关键技术:莫比乌斯反演用于理论化简,以及被誉为数论筛法“天花板”的Min_25筛用于高

weixin_33978044的博客 468

IMU预积分本质:为图优化设计的状态解耦增量建模

IMU预积分是视觉-惯性SLAM中的核心建模技术,其本质并非高精度数值积分,而是面向非线性优化器(如g2o、Ceres)构建的可微分、状态解耦的相对运动增量表达。它基于IMU运动学模型,通过李群李代数工具将角速度与加速度测量转化为旋转增量ΔR、速度增量Δv和位置增量Δp,并显式建模陀螺仪零偏、加速度计零偏等时变误差源。关键技术价值在于提供解析雅可比矩阵,保障优化过程中IMU约束的高效、稳定收敛;典型应用场景包括VINS-Mono、OKVIS、ORB-SLAM3+IMU等紧耦合系统,在实时性、鲁棒性和标定精度

weixin_31062533的博客 268

常用算法代码模板与题单 | G - 数学(更新于2026.10.7)

这篇文档其实是我自己学习路上的一份“复习笔记”。之前看了不少教程,零零散散记了一堆代码片段和小技巧,时间久了就容易忘,翻起来也麻烦。所以干脆花时间整理了一下,把常用的模板、容易踩的坑、还有一些个人觉得挺实用的小技巧都归到了一起。 如果你也在学类似的东西,或许能帮你省下一些翻找的时间;如果有哪里写得不清楚或不对,也欢迎随时指正交流。 希望这份整理也能对你有一点点帮助~ ✨

团爸讲算法 245
上一篇: CCPC-Wannafly Winter Camp Day3 F.小清新数论(数论分块+(莫比乌斯反演/杜教筛))
下一篇: hdu3530 Subsequence(单调队列)
小衣同学
博客等级 码龄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、付费专栏及课程。

余额充值