【笔记】矩阵快速幂
前置芝士
快速幂。
什么是矩阵?
矩阵,是由
比如:
矩阵乘法
矩阵乘法的条件:仅当第
U401562 矩阵乘法(站外题)
矩阵乘法的计算方法:
了解了这些以后,代码就迎刃而解:
第一层循环枚举
for(k=1;k<=n;k++)
for(i=1;i<=m;i++)
for(j=1;j<=p;j++)
c[i][j]+=a[i][k]*b[k][j];
就是
这样就可以得到一个
矩阵快速幂
不懂快速幂的可以见顶部。
矩阵快速幂,用于解决
比如求斐波那契数列的第
- 首先特判
的情况。
将上面的递推公式变为矩阵:
矩阵
然后通过递推公式
通过如上公式,不停迭代,如果求
因此可以得到如下公式:
咦,这不就是快速幂吗?只不过把乘法改成了矩阵乘法而已嘛。
我们可以定义一个结构体,用重载操作符代替矩阵乘法,于是代码如下:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll MOD=1e9+7;
const ll N=3;
ll n,k;
struct node{
ll x[N][N];
node(){
memset(x,0,sizeof(x));
}
inline void bases(){
memset(x,0,sizeof(x));
x[1][1]=x[1][2]=x[2][1]=1;
}
inline void anses(){
memset(x,0,sizeof(x));
x[1][1]=x[2][1]=1;
}
node operator *(const node &b)const{//重载操作符。
node anss;
for(ll k=1;k<=2;k++)//矩阵乘法模板。
for(ll i=1;i<=2;i++)
for(ll j=1;j<=2;j++)
anss.x[i][j]=(anss.x[i][j]+x[i][k]*b.x[k][j])%MOD;
return anss;
}
}base,ans;
inline void init(){
base.bases();
ans.anses();
}
inline void quick_pow(ll n){//矩阵快速幂。
while(n){
if(n&1) ans=base*ans;
base=base*base;
n>>=1;
}
}
int main(){
cin>>n;
if(n<=2){
cout<<1<<endl;
exit(0);
}
init();
quick_pow(n-2);
cout<<ans.x[1][1]<<endl;
return 0;
}
经典例题
就是一道矩阵快速幂模板啦。
#define ll long long
const ll MOD=1e9+7;
const ll N=1e2+10;
ll n,k;
struct node{
ll x[N][N];
node(){memset(x,0,sizeof(x));}
inline void init(){//定义 init() 函数初始化,只有该结构体才允许该初始化。
for(ll i=1;i<=n;i++) x[i][i]=1;
}
//说句闲话:还可以把矩阵乘法也搬进来。
}a;
node operator * (const node &a,const node &b){//矩阵乘法。
node ans;
for(ll k=1;k<=n;k++)
for(ll i=1;i<=n;i++)
for(ll j=1;j<=n;j++){
ans.x[i][j]=(ans.x[i][j]+a.x[i][k]*b.x[k][j]%MOD)%MOD;
}
return ans;
}
int main(){
cin>>n>>k;
for(ll i=1;i<=n;i++)
for(ll j=1;j<=n;j++) cin>>a.x[i][j];
node ans;
ans.init();//初始化。
while(k){//矩阵快速幂。
if(k&1) ans=ans*a;
a=a*a;
k>>=1;
}
for(ll i=1;i<=n;i++){
for(ll j=1;j<=n;j++)
cout<<ans.x[i][j]<<" ";
cout<<endl;
}
return 0;
}
题目给出
让我们求
我们平时的斐波那契数列里,
这里,
我们试着规划矩阵:
明显,矩阵为
验证一下,
最后注意取余,初始化不要弄错位置。
代码就不展示了,反正和上面的几乎一样,改一下就行啦。
本文来自博客园,作者:2021zjhs005,转载请注明原文链接:https://www.cnblogs.com/2021zjhs005/p/18014138
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探