矩阵优化
矩阵运算
加减:要求行列数一致,对应位相加减
乘:对于 ,答案 ,要求第一个矩阵列数等于第二个矩阵行数。注意矩阵乘法具有结合律但不具有交换律
矩阵求逆:需要用到行列式,暂咕
矩阵优化递推
最常见的斐波那契有递推式
如果只需要知道第 项的值( 很大),可以这样做:
定义初始矩阵:
要乘一个转移矩阵 结果为答案矩阵
那么 可以构造为:
通过定义可以证明这样构造是对的
根据矩阵的结合律,最终要乘 次转移矩阵,不妨先求转移矩阵的 次方然后再乘初始矩阵
而 次方可以快速幂优化
下面采用重载运算符处理矩乘运算
代码实现
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
int n;
struct Mat{
int a[2][2];
Mat(){a[0][0]=a[1][0]=a[0][1]=a[1][1]=0;}
};
Mat operator * (Mat b,Mat c){
Mat ans;
for(int i=0;i<=1;i++){
for(int j=0;j<=1;j++){
for(int k=0;k<=1;k++){
ans.a[i][j]=(ans.a[i][j]+b.a[i][k]*c.a[k][j]%mod)%mod;
}
}
}
return ans;
}
Mat po(Mat a,int b){
Mat ans;
ans.a[0][0]=ans.a[1][1]=1;
while(b){
if(b&1)ans=ans*a;
a=a*a;
b>>=1;
}
return ans;
}
signed main(){
cin>>n;
if(n==1||n==2){
cout<<1;
return 0;
}
Mat c;
c.a[0][1]=c.a[1][0]=c.a[1][1]=1;
Mat p=po(c,n-2);
Mat b;
b.a[0][0]=b.a[0][1]=1;
b=b*p;
cout<<b.a[0][1];
return 0;
}
矩阵优化图上问题
对于图上的 ,有限制为与一个点有连边的点才能转移
而如果进行多次这样的操作,可以用矩阵把状态的转移记录下来,用快速幂优化
比如这道题,除了终点一个点可以向相邻点连边,那么表达在矩阵上即为 以及 的位置为
快速幂后即可知道方案数是多少了
代码实现
#include<bits/stdc++.h>
using namespace std;
const int mod=1000;
const int m=8;
int n;
struct Mat{
int d[10][10];
Mat(){memset(d,0,sizeof d);}
};
Mat operator * (Mat a,Mat b){
Mat ans;
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
for(int k=1;k<=m;k++){
ans.d[i][j]+=a.d[i][k]*b.d[k][j]%mod;
}
}
}
for(int i=1;i<=m;i++)for(int j=1;j<=m;j++)ans.d[i][j]%=mod;
return ans;
}
Mat po(Mat a,int b){
Mat ans;
for(int i=1;i<=m;i++)ans.d[i][i]=1;
while(b){
if(b&1)ans=ans*a;
a=a*a;
b>>=1;
}
return ans;
}
int main(){
cin>>n;
Mat a;
for(int i=1;i<=m-1;i++){
if(i==4)continue;
a.d[i+1][i]=1;
}
for(int i=2;i<=m;i++){
if(i==6)continue;
a.d[i-1][i]=1;
}
a.d[m][1]=a.d[1][m]=1;
Mat ans=po(a,n);
Mat k;k.d[1][1]=1;
k=k*ans;
cout<<k.d[1][5];
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】