矩阵运算快速幂来快速计算线性递推式

本文介绍了如何利用矩阵快速幂的方法优化线性递推式的计算,通过矩阵乘法和快速幂取模模板,降低计算斐波那契数列等线性递推问题的时间复杂度。并给出了具体实现代码以及转化线性递推式为矩阵形式的思路,以HDU 1757题为例进行说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

斐波那契数列
f(0)=0; f(1)=1; f(n)=f(n-1)+f(n-2),n>1

从上面这个方程中我们可以看到很明显的递推关系,当n>1的时候很明显发现会有一个关系式,但是实际上我们在做运算的时候,如果一步一步的按照递推式计算,将会消耗大量的时间(最短也是O(n)的时间复杂度),于是我们这个时候就需要引入矩阵乘法和快速幂来减少时间复杂度

矩阵乘法:
设A为mp的矩阵,B为pn的矩阵,那么称m*n的矩阵C为矩阵A与B的乘积,其中矩阵C中的第i行第j列元素可以表示为A的第i行与B的第j列对应元素乘积和

矩阵相乘:矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义。一般单指矩阵乘积时,指的便是一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑的集中到了一起,所以有时候可以简便地表示一些复杂的模型。
设A为mp的矩阵,B为pn的矩阵,那么称m*n的矩阵C为矩阵A与B的乘积,记作C=AB:

首先:快速幂取模模板
例如:求x的n次幂并取模

	int quickmod(long long n,long long x,long long r) //整型的
	{
   
		int ans=1;
		while(n)
		{
   
			if(n&1)
				ans=ans*x%r;
			n>>=1;
			x=x*x%r;
		}
		return ans;
	} 

矩阵 (struct)来定义

struct   Matrix{
   
	int m[2][2];
} 

矩阵的乘法运算

    Matrix mul(Matrix k,Matrix n)
    {
   
        matrix ans;
        for(int i=0;i<2;i++)
            for(int j=0;j<2;j++)
            {
   
                ans.m[i][j]=0;
                for(int k=0;k<2;k++)
                //ans.m[i][j]+=A.m[i][k]*B.m[k][j]%mod;
        		//修正
        		ans.m[i][j] +=A.m[i][k]*B.m[k][k];
        		ans.m[i][j] = ams.m[i]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值