矩乘优化学习笔记

news/2025/11/28 9:49:01/文章来源:https://www.cnblogs.com/zloi-hhq/p/19280409

矩阵乘法方式,左边的行乘上右边的列,最终答案的行数与左边相等,列数与右边相等

左行右列

矩阵乘法必须在左矩阵列数与右矩阵行数相同时才可以进行

矩阵乘法满足结合律,不满足一般的交换律。

板子:

struct MT{int c[7][7],n,m;MT(){n=m=0;memset(c,0x3f,sizeof(c));}void I(){memset(c,0x3f,sizeof(c));for(int i=1;i<=n;i++)c[i][i]=0;}MT friend operator*(MT a,MT b){MT c;c.n=a.n,c.m=b.m;for(int i=1;i<=a.n;i++){for(int j=1;j<=b.m;j++){for(int k=1;k<=a.m;k++)c.c[i][j]=min(c.c[i][j],a.c[i][k]+b.c[k][j]);}}return c;}
};

常见优化

  1. 循环展开,直接将矩阵乘法展开
  2. 缩短查询路径,也是优化矩阵
  3. 矩阵加速递推的快速幂,唯一一个优化了时间复杂度的

应用

矩阵加速递推

致敬传奇斐波那契。

可以用矩阵存下对下一步有影响的值,然后通过各种换算得到下一步时的这个值

由于我们是直接调用原矩阵的元素,所以一定要注意目前的状态是否确定

当然这样是远远不够的,由于矩阵乘法符合交换律,直接快速幂即可

最有意思的应该是 Another kind of Fibonacci

众所周知,斐波那契数列:F(0) = 1, F(1) = 1, F(N) = F(N - 1) + F(N - 2) (N >= 2)。现在我们定义另一种斐波那契数列:A(0) = 1, A(1) = 1, A(N) = X * A(N - 1) + Y * A(N - 2) (N >= 2)。我们想要计算S(N),S(N) = A(0)2 +A(1)2+……+A(n)2。

这里需要把新得到的数的平方和乘积都得到,需要推导式子,拆掉新得到的数字,考虑乘积的增加量,得到最终答案。

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=10007;
int t,n,x,y;
struct MT{int n,m,c[20][20];MT(){n=m=0;memset(c,0,sizeof(c));}void I(){memset(c,0,sizeof(c));for(int i=1;i<=n;i++)c[i][i]=1;}void clear(){memset(c,0,sizeof(c));}MT friend operator*(MT a,MT b){MT c;c.n=a.n,c.m=b.m;for(int i=1;i<=a.n;i++){for(int j=1;j<=b.m;j++){for(int k=1;k<=a.m;k++){c.c[i][j]+=(a.c[i][k]*b.c[k][j])%mod;c.c[i][j]%=mod;}}}return c;}void input(){for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)cin>>c[i][j];}}
}base,be;
void ksm(MT a,int b){while(b){if(b&1)be=be*a;a=a*a;b>>=1;}
}
signed main(){while(cin>>n>>x>>y){x%=mod;y%=mod;be.n=1,be.m=4;be.c[1][1]=1,be.c[1][2]=1,be.c[1][3]=1,be.c[1][4]=1;base.n=base.m=4;base.c[1][1]=1;base.c[2][1]=1;base.c[2][2]=(x*x)%mod;base.c[3][2]=(y*y)%mod;base.c[4][2]=(2*x*y)%mod;base.c[2][3]=1;base.c[2][4]=x;base.c[4][4]=y;ksm(base,n);cout<<be.c[1][1]<<endl;
//		cout<<be.c[1][1]<<' '<<be.c[1][2]<<' '<<be.c[1][3]<<' '<<be.c[1][4]<<endl;}return 0;
}

矩阵表达修改

和oi-wiki上的例题一样,大魔法师,先预处理出矩阵,在线段数里面放矩阵即可,还是比较水的题目。

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=998244353;
int n,op,l,r,v,m;
int read(){char c=getchar();int x=0;while(c<'0'||c>'9')c=getchar();while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();return x;
}
int add(int x,int y){int ans=x+y;if(ans>=mod)ans-=mod;return ans;
}
struct MT{int n,m,c[5][5];MT(){n=m=0;}MT (int _n,int _m){n=_n;m=_m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)c[i][j]=0;}}void I(){for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)c[i][j]=0;}for(int i=1;i<=n;i++)c[i][i]=1;}void input(){for(int j=1;j<=3;j++)c[1][j]=read();c[1][4]=1;}MT friend operator*(MT a,MT b){MT c(a.n,b.m);for(int i=1;i<=a.n;i++){for(int j=1;j<=b.m;j++){for(int k=1;k<=a.m;k++){c.c[i][j]+=(a.c[i][k]*b.c[k][j])%mod;}c.c[i][j]%=mod;}}return c;}MT friend operator+(MT a,MT b){MT c;c.n=a.n;c.m=b.m;c.c[1][1]=add(a.c[1][1],b.c[1][1]);c.c[1][2]=add(a.c[1][2],b.c[1][2]);c.c[1][3]=add(a.c[1][3],b.c[1][3]);c.c[1][4]=add(a.c[1][4],b.c[1][4]);c.c[2][1]=add(a.c[2][1],b.c[2][1]);c.c[2][2]=add(a.c[2][2],b.c[2][2]);c.c[2][3]=add(a.c[2][3],b.c[2][3]);c.c[2][4]=add(a.c[2][4],b.c[2][4]);c.c[3][1]=add(a.c[3][1],b.c[3][1]);c.c[3][2]=add(a.c[3][2],b.c[3][2]);c.c[3][3]=add(a.c[3][3],b.c[3][3]);c.c[3][4]=add(a.c[3][4],b.c[3][4]);c.c[4][1]=add(a.c[4][1],b.c[4][1]);c.c[4][2]=add(a.c[4][2],b.c[4][2]);c.c[4][3]=add(a.c[4][3],b.c[4][3]);c.c[4][4]=add(a.c[4][4],b.c[4][4]);return c;}void print(){for(int j=1;j<=3;j++)printf("%lld ",c[1][j]);puts("");}
}q[10];
struct ST{MT c[1000005],tag[1000005];#define ls p<<1#define rs p<<1|1void pushup(int p){c[p]=c[ls]+c[rs];}void build(int p,int l,int r){c[p].n=1;c[p].m=4;tag[p].n=tag[p].m=4;tag[p].I();if(l==r)return c[p].input();int mid=l+r>>1;build(ls,l,mid),build(rs,mid+1,r);pushup(p);}void Tag(int p,MT v){c[p]=c[p]*v;tag[p]=tag[p]*v;}void pushdown(int p){Tag(ls,tag[p]);Tag(rs,tag[p]);tag[p].I();}void change(int p,int l,int r,int L,int R,MT v){if(l>=L&&r<=R)return Tag(p,v);pushdown(p);int mid=l+r>>1;if(mid>=L)change(ls,l,mid,L,R,v);if(mid<R)change(rs,mid+1,r,L,R,v);pushup(p);}MT query(int p,int l,int r,int L,int R){if(l>=L&&r<=R)return c[p];pushdown(p);int mid=l+r>>1;if(mid>=L&&mid<R)return query(ls,l,mid,L,R)+query(rs,mid+1,r,L,R);if(mid>=L)return query(ls,l,mid,L,R);return query(rs,mid+1,r,L,R);}
}seg;
signed main(){q[1].n=q[1].m=4;q[1].I();q[1].c[2][1]=1;q[2].n=q[2].m=4;q[2].I();q[2].c[3][2]=1;q[3].n=q[3].m=4;q[3].I();q[3].c[1][3]=1;cin>>n;seg.build(1,1,n);cin>>m;while(m--){op=read(),l=read(),r=read();if(op<=3)seg.change(1,1,n,l,r,q[op]);else if(op==7)seg.query(1,1,n,l,r).print();else {v=read();MT tmp(4,4);tmp.I();if(op==4)tmp.c[4][1]=v;if(op==5)tmp.c[2][2]=v;if(op==6)tmp.c[3][3]=0,tmp.c[4][3]=v;seg.change(1,1,n,l,r,tmp);}}return 0;
}

一系列的图上路径问题

虽然oi-wiki上的内容很多,但是实际上都差不多,重要的是关注每一条路径走一遍,可以通过矩阵倍增处理。

就是通过这种方式来固定走的边数,再check一下即可。

不管是判环还是什么都可以

例题:

Gremlin的繁殖

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,t,k,y,g[1005],h[1005];
struct MT{int c[105][105];MT(){memset(c,0x3f,sizeof(c));}MT friend operator*(MT a,MT b){MT c;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){for(int k=1;k<=n;k++)c.c[i][j]=min(c.c[i][j],a.c[i][k]+b.c[k][j]);}}return c;}bool check(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(c[i][j]<=t)return true;}}return false;}
}st[51],be,tmp,tmp2;
signed main(){cin>>n>>t;for(int i=1;i<=n;i++){cin>>k>>y;for(int j=1;j<=k;j++)cin>>g[j];for(int j=1;j<=k;j++)cin>>h[j];for(int j=1;j<=k;j++){st[0].c[i][g[j]]=min(h[j]+y,st[0].c[i][g[j]]);}}for(int i=1;i<=50;i++)st[i]=st[i-1]*st[i-1];for(int i=1;i<=n;i++)be.c[i][i]=0;int ans=0;for(int i=50;i>=0;i--){tmp=be*st[i];if(tmp.check()){ans+=(1ll<<i);be=tmp;}}cout<<ans;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/979297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速访问hosts文件-小技巧

如何快速访问hosts文件 简单说明一下什么是hosts文件,hosts文件在平常使用中,主要是用于快速修改域名解析、测试内网服务、屏蔽广告域名等。 在Windows中hosts文件的路径为C:\Windows\System32\drivers\etc\hosts 在…

2025年11月情人节送女友礼物推荐:知名品牌榜单与选购指南

情人节送礼是表达爱意的重要方式,尤其是为女友挑选礼物时,许多男性会面临选择困难。从用户视角出发,选购情人节礼物的典型需求包括体现心意、符合女友喜好、具备实用价值以及在一定预算内达到最佳效果。根据市场调研…

2025年11月情人节送女友礼物推荐:一份综合市场口碑与用户评价的礼品清单指南

情人节作为表达爱意的重要时刻,选择合适的礼物成为许多人的关注焦点。根据市场调研数据显示,近年来护肤品在情人节礼品选择中的占比呈现稳步上升趋势,特别是具有抗老功效的精华类产品更受消费者青睐。从用户需求角度…

创建 Vue 应用

创建Vue应用 前提 确保安装了Node.js,并且当前工作目录正是打算创建项目的目录。 步骤1:创建项目 在命令行中运行以下命令: npm create vue@latest该指令会安装并执行 create-vue(Vue官方项目脚手架工具),随后将…

2025年11月情人节送女友礼物推荐:一份权威选择的礼物清单与选购指南

情人节即将来临,选择一份能够表达心意的礼物成为许多人的关注焦点。特别是为女友挑选礼物时,不仅需要体现用心,还要考虑实用性、品牌口碑以及是否符合对方的需求。许多用户在挑选礼物时常常面临几个常见痛点:如何避…

2025年仓储货架品牌前十强推荐榜单

摘要 随着物流和仓储行业的快速发展,2025年仓储货架市场需求持续增长,企业对于可靠、专业的货架供应商需求日益迫切。本文基于行业数据和用户反馈,综合评估了仓储货架品牌的实力、技术、服务等因素,为您提供前十强…

电路初学者指南-全-

电路初学者指南(全)原文:zh.annas-archive.org/md5/8a82bd96d926949bee96683f442068ce 译者:飞龙 协议:CC BY-NC-SA 4.0前言 本书将帮助你提高电子技能。我将教你如何解读电路图并使用面包板。然后,我将逐步演示…

文件摆渡系统品牌是什么?主要有哪几种选择?

文件摆渡系统品牌是为企业提供安全和高效文件传输解决方案的重要参与者。这些品牌专注于加强数据保护,同时确保用户能够方便、快捷地进行文件共享。随着数据量的增加和信息安全要求的提高,市场上涌现出多种品牌,满足…

Vue响应式数据更新问题解决方案

问题现象 明明数组有值 但是页面下拉框不显示数据问题原因响应式数据更新时机问题:Vue 可能没有检测到 widget.options.remoteOptionsTree 的变化数据异步加载:数据可能在组件渲染后才加载对象属性变化未被检测:如…

2025年11月抗老护肤品排行榜:五款高口碑产品深度对比解析

2025年11月抗老护肤品推荐:权威口碑榜单与科学选购指南 随着生活节奏加快和环境污染加剧,抗衰老已成为现代人护肤的重要需求。特别是进入秋冬季节,肌肤容易因干燥缺水而加速老化,选择一款适合的抗老护肤品显得尤为…

题解:P5226([SCOI2015] 小凸解密码)

1. Description 小凸得到了一个密码盘,密码盘被等分成 \(n\) 个扇形,每个扇形上有一个数字 \((0 \sim 9)\),和一个符号 \((\) + 或 * \()\)。密码盘解密的方法如下: 首先,选择一个位置开始,顺时针地将数字和符号…

2025年11月景区饮品供应商口碑排行榜:高性价比解决方案与避坑指南

随着旅游市场的快速复苏和消费者对健康饮品的需求升级,景区饮品供应商的选择成为众多景区运营者关注的重点。作为景区管理者或采购负责人,您可能正在寻找既符合健康趋势又能提升游客满意度的饮品解决方案。当前景区饮…

微信公众号全部文章

2025-11-28: Oracle归档管理 2025-11-19: Oracle控制文件故障处理指南(FS文件系统) 2025-11-05: Oracle RAC节点添加完整操作指南:从单机到集群,从两节点到多节点 2025-10-31: Oracle RAC节点删除操作指南 2020-10…

2025大容量承压储水罐厂家+热水贮罐厂家实力盘点

2025大容量承压储水罐厂家+热水贮罐厂家实力盘点!在选择大容量承压储水罐厂家时,建议从多个维度进行综合评估。首先,厂家的专业资质是基础保障,包括压力容器制造许可证、焊接工艺评定证书以及质量管理体系认证等。其…

2025年11月景区饮品供应商推荐榜单与选择指南:主流品牌深度对比分析

随着旅游消费升级和健康饮食理念的普及,景区饮品供应商的选择已成为景区运营管理中的重要环节。作为景区管理者或采购负责人,您可能正在寻找既符合健康趋势又能提升游客满意度的饮品解决方案。当前景区饮品市场呈现出…

2025年11月抗老护肤品排行榜单解析:基于真实数据的权威推荐

2025年11月抗老护肤品推荐榜单与选购指南:一份基于市场数据的客观分析 随着现代生活节奏加快和环境压力增大,抗衰老护肤需求呈现出显著增长趋势。根据中国化妆品行业协会发布的2024年护肤消费数据显示,抗老类护肤品…

2025年11月抗老精华排行榜:五款高口碑产品深度评测与选择指南

2025年11月抗老精华推荐榜单:一份基于市场数据与用户口碑的权威选择指南 在当今护肤市场中,抗老精华已成为众多消费者日常护理的核心步骤。随着生活节奏加快与环境压力增大,肌肤老化问题呈现年轻化趋势,消费者对高…

2025年11月景区饮品供应商深度分析:主流品牌性能参数与用户满意度

作为景区管理者或运营方,选择饮品供应商时往往面临多重考量:既要满足游客对健康、清爽饮品的即时需求,又需兼顾供应商的稳定性、定制化能力与合规性。当前,景区饮品市场呈现两大趋势:一是消费者对无添加、清洁标签…

快速了解Linux中的sysctl命令

1、概述 在Linux系统中,内核是系统的核心,控制着一切硬件和软件资源。而内核的行为,例如网络数据包如何转发、内存如何分配、文件句柄数量限制等,都是由一系列可调的“参数”控制的。那么,如何动态地查看和调整这…

题解:洛谷 P9871([NOIP2023] 天天爱打卡)

1. Description 小 T 同学非常热衷于跑步。为了让跑步更加有趣,他决定制作一款叫做《天天爱打卡》的软件,使得用户每天都可以进行跑步打卡。 开发完成后,小 T 同学计划进行试运行,他找了大 Y 同学来帮忙。试运行共…