矩阵乘法求斐波那契数列(快速幂)

本文介绍了一种利用矩阵乘法和快速幂技术解决特定数列问题的方法。通过定义矩阵并运用快速幂运算,能够高效地计算出数列的指定项。

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

首先介绍矩阵乘法:

定义:设A=(
   
)为
   
的矩阵,B=(
   
)为
   
的矩阵,那么称
   
的矩阵C=(
   
)为矩阵A与B的乘积,记作
   
,其中矩阵C中的第
   
   
列元素为
由定义可知,
1:当矩阵A的列数等于矩阵B的行数时,A与B可以相乘。
2:矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。
3:乘积C的第
   
行第
   
列的元素
   
等于矩阵A的第
   
行的元素与矩阵B的第
   
列对应元素乘积之和。
c[i][j]=Σa[i][k]*b[k][j]。
例如:
 
 
定义矩阵
 
注意 矩阵乘法一般不满足交换律。即:
 
然后由该数列定义可知,
矩阵乘法 <wbr> <wbr>求斐波那契数列
矩阵乘法 <wbr> <wbr>求斐波那契数列
所以目的就是求出前面的系数,需要用到快速幂(当然,如果比较小的话就不需要了,其实如果比较小也不需要用矩阵。。。)
至于快速幂就是和普通的是一样的,只是相乘就需要用到矩阵相乘啦。
</pre><pre name="code" class="cpp">#include <cstdio>
#include <iostream>
using namespace std;
int T,n;
long long q;
struct aaaa{
   long long a[2][2];
}base,ans;
void get_f(void);
aaaa cheng(aaaa a,aaaa b);
int main()
{
    cin>>T;
	while(T--){
	   cin>>n>>q;
	   get_f();
	   cout<<(ans.a[1][0]+ans.a[1][1])%q<<endl;
	}
return 0;
}
void get_f(void)
{
    ans.a[0][0]=ans.a[1][1]=1;
	ans.a[0][1]=ans.a[1][0]=0;
	base.a[0][0]=base.a[0][1]=base.a[1][0]=1;
	base.a[1][1]=0;
	while(n>0){//特别说明,之前说是n-1次,那么我使用下面的f[(n+1)-1]就是f[n]了
	    if(n&1){
		    ans=cheng(ans,base);
		}
		base=cheng(base,base);
		n=n>>1;
	}
}
aaaa cheng(aaaa a,aaaa b)
{
    aaaa x;
	x.a[0][0]=a.a[0][0]*b.a[0][0]+a.a[0][1]*b.a[1][0];
	x.a[0][0]%=q;
	x.a[0][1]=a.a[0][0]*b.a[0][1]+a.a[0][1]*b.a[1][1];
	x.a[0][1]%=q;
	x.a[1][0]=a.a[1][0]*b.a[0][0]+a.a[1][1]*b.a[1][0];
	x.a[1][0]%=q;
	x.a[1][1]=a.a[1][0]*b.a[0][1]+a.a[1][1]*b.a[1][1];
	x.a[1][1]%=q;
	return x;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值