【C++算法模板】矩阵快速幂

适用题目

适用于类斐波那契数列问题。需要递推来确定关系。

 综上所述,我们需要做的是列出初始条件的 F 矩阵,如F(1) = 1, F(2) = 1等初始情况;然后找到 A 矩阵 ,用于求幂,最后我们算好 A^{n} 即可。


矩阵快速幂模板

这里使用了斐波那契数列为例子。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int M = 2;	//A矩阵的维度
struct 	Matrix{
	int a[M][M];
	Matrix(){		//初始化 
		memset(a, 0, sizeof(a));
	}
	//可以转化,也可以不转,根据需求  
	void unit(){
		a[0][0] = a[1][1] = 1;
		a[0][1] = a[1][0] = 0;
	}
	//乘法的算符重载 
	Matrix operator*(const Matrix &B) const {
		Matrix ans;
		for(int i = 0; i < M; i++){
			for(int j = 0; j < M; j++){
				for(int k = 0; k < M; k++){
					ans.a[i][j] += a[i][k] * B.a[k][j];
				}
			}
		}
		return ans;
	} 
	//类似整数快速幂的操作 
	Matrix operator^(int n) const {
		Matrix ans;
		ans.unit();
		Matrix A = *this;
		while(n){
			if(n & 1){
				ans = ans * A;
			}
			A = A * A;
			n >>= 1;
		}
		return ans;
	}
	void show(){
		cout << "Matrix" << endl;
		for(int i = 0; i < M; i++){
			for(int j = 0; j < M; j++){
				cout << a[i][j] << " ";
			}
			cout << endl;
		} 
	}
}; 
int main(){
	//A
	//0 1 
	//1 1
	Matrix A;
	A.a[0][0] = 0;
	A.a[0][1] = A.a[1][0] = A.a[1][1] = 1;
	A.show();
	//F
	//1 0 
	//1 0
	Matrix F;
	F.a[0][0] = F.a[1][0] = 1;
	F.a[0][1] = F.a[1][1] = 0;
	F.show();
	
	int n = 8;
	Matrix ans = (A^n)*F;
	ans.show();
	return 0;
} 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

见见大魔王

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

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

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

打赏作者

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

抵扣说明:

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

余额充值