矩阵的c++实现(2)

上一次我们了解了矩阵的运算和如何使用矩阵解决斐波那契数列,这一次我们多看看例题,了解什么情况下用矩阵比较合适。

先看例题

1.洛谷P1939 【模板】矩阵加速(数列)

模板题应该很简单。

补:1<n<=10^9

10^9肯定超了,所以可以用矩阵做

我们可以观察到,每一项(x>3)都是由两个量组成,于是创建矩阵:

同时:

那么因为如果要再让,A*base 之后还是应该是前一个为一项,后一项为它的两项前。所以?处应为。??处应为什么自己想想,发在评论区里吧。

但是,在A中并没有出现,这样我们就不可以用A*base表示B了,因为矩阵的乘法中,必须要上一个矩阵中有的元素,才能进入下一个矩阵中。

无论怎样,都无法表示为的形式,所以B不可以由A构成。

那这个时候就可以用一个巧妙的方法:我们在A和B中都增加这一项,这样就会变成

可以表示为,这样就可以满足每一个条件都可以了。

那么我们利用矩阵乘法,在纸上演算七七四十八个小时,就可以得出,

那么用和斐波那契数列一样的做法,快速幂即可

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
struct Matrix{
	int n,m;
	long long a[100][100];
	Matrix(){
		memset(a,0,sizeof(a));
	}
	Matrix(int _n,int _m){
		n=_n;
		m=_m;
		memset(a,0,sizeof(a));
	}
};
Matrix ans(1,3);
Matrix base(3,3);
void init(){
	ans.a[0][0]=1;
	ans.a[0][1]=1;
	ans.a[0][2]=1;
	base.a[0][0]=1;base.a[0][1]=1;base.a[0][2]=0;
	base.a[1][0]=0;base.a[1][1]=0;base.a[1][2]=1;
	base.a[2][0]=1;base.a[2][1]=0;base.a[2][2]=0;
}
Matrix mul(Matrix a,Matrix b){
	Matrix res(a.n,b.m);
	for(int i=0;i<a.n;i++){
		for(int j=0;j<b.m;j++){
			for(int k=0;k<a.m;k++){
				res.a[i][j]+=a.a[i][k]*b.a[k][j]%mod;
			}
			res.a[i][j]%=mod;
		}
	}
	return res;
}
Matrix bpow(Matrix a,long long n){
	Matrix res(a.n,a.n);
	for(int i=0;i<a.n;i++)res.a[i][i]=1;
	while(n!=0){
		if(n&1){
			res=mul(res,a);
		}
		a=mul(a,a);
		n>>=1;
	}
	return res;
}
long long F(long long n){
	base=bpow(base,n-3);
	/*for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			cout<<base.a[i][j];
		}
		cout<<endl;
	}*/
	ans=mul(ans,base);
	return ans.a[0][0]%mod;
}
int main(){
	long long t;
	cin>>t;
	while(t--){
		long long n;
		cin>>n;
		if(n<=3){
			cout<<1<<endl;
			continue;
		}
		init();
		cout<<F(n)<<endl;
	}
	return 0;
}

2.洛谷P1349 广义斐波那契数列

其实很简单,就是把斐波那契数列的模板套一下

先写一半

相关推荐
203号居民1 小时前
LeetCode hot 100 —41. 缺失的第一个正数
数据结构·算法·leetcode
专注仿真3 小时前
问答大模型技术方案算法实现-熵权法融合算法 + 交叉编码器重排算法
人工智能·python·算法·语言模型·问答大模型关键算法·熵权融合算法·交叉编码器重排算法
烧酒同学4 小时前
【C++】记录size of std::vector的巧妙坑
开发语言·c++·图形渲染
地平线开发者4 小时前
量化为什么会有损失:从量化误差到精度下降
算法
手写码匠5 小时前
华为云Flexus+DeepSeek征文|Dify 多 Agent 会话管理与上下文工程实战:让智能体“记住该记住的,忘掉该忘掉的“
人工智能·深度学习·算法·aigc
2401_862880825 小时前
数据结构 --- 栈
c语言·数据结构·算法
致Great5 小时前
Qwen3.8-27B 接入 DSH 全流程实测:写代码、跑长任务,都没问题
算法
Tisfy6 小时前
LeetCode 3471.找出最大的几近缺失整数:三种情况判断
算法·leetcode·题解·分类讨论
linux-hzh6 小时前
百日算法修炼 · Day 12
算法·深度优先
@呱呱爱学习6 小时前
C++大成之路_ STL容器_ Vector
开发语言·c++