当前位置: 首页 > news >正文

【题解】Luogu P10502 Matrix Power Series

题意分析

给定一个 \(n \times n\) 的矩阵 \(A\) 和正整数 \(k\),求 \(S=A^1+A^2+\cdots+A^k\)

解题思路

\(A^n\) 要用到矩阵快速幂。但是 \(k \le 10^9\),求 \(k\) 个幂会超时,所以需要用到分治的策略。

我们知道,矩阵乘法满足乘法分配律,即 \(A \times C + B \times C = (A + B) \times C\)。那么我们就可以二分 \(k\)\(A^{mid+1}\) 加到 \(A^r\) 就等于 \(A^l\) 加到 \(A^{mid}\)\(A^{\frac{r-l+1}{2}}\)。当 \((r-l+1)\) 是偶数即 \(l\)\(r\) 之间的项数为偶数时,求 \(A^l\) 加到 \(A^{mid}\)\(A^{\frac{r-l+1}{2}}\) 再加 \(A^l\) 加到 \(A^{mid}\),而求 \(A^l\) 加到 \(A^{mid}\) 时可以继续二分,直到 \(l=r\) 为止。当 \((r-l+1)\) 是奇数时,我们把多出来的一项单独求(这里选择第 \(l\) 项),剩下的用二分求。如此一来时间复杂度就会压缩到 \(O(\log k)\)

写一个简单的递归即可。

代码实现

#include<iostream>
#include<cstring>
#define int long long 
using namespace std;
struct Matrix{int mx[110][110];
}a,s,c;
int n,m,k;
Matrix operator *(const Matrix &a,const Matrix &b){//运算符重载为矩阵乘法 memset(c.mx,0,sizeof(c.mx));for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){for(int d=1;d<=n;d++){c.mx[i][j]=(c.mx[i][j]+(a.mx[i][d]*b.mx[d][j])%m)%m;}}}return c;
}
Matrix operator +(const Matrix &a,const Matrix &b){//运算符重载为矩阵加法 memset(c.mx,0,sizeof(c.mx));for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){c.mx[i][j]=(a.mx[i][j]+b.mx[i][j])%m;}}return c;
}
Matrix ksm(Matrix a,int k){//快速幂 Matrix d,e=a;memset(d.mx,0,sizeof(d.mx));for(int i=1;i<=n;i++) d.mx[i][i]=1;while(k){if(k&1) d=d*e;e=e*e;k>>=1;}return d;
}
Matrix sum(int l,int r){//二分 if(l==r){return ksm(a,l);}if((r-l+1)%2==0){int mid=(l+r)/2;Matrix x=ksm(a,mid+1-l),y=sum(l,mid);return y+y*x;}else{return sum(l,l)+sum(l+1,r);}
}
signed main(){cin>>n>>k>>m;for(int i=1;i<=n;i++) s.mx[i][i]=1;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>a.mx[i][j];a.mx[i][j]%=m;}}s=sum(1,k);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++) cout<<s.mx[i][j]<<" ";cout<<endl;}return 0;
}

注意事项

记得随时取余 \(m\)

http://www.rkmt.cn/news/89371.html

相关文章:

  • SpringBoot 企业级接口加密【通用、可配置、解耦的组件】「开闭原则+模板方法+拦截器/中间件模式」
  • 【题解】Luogu P5175 数列
  • 论文AI率90%→5%!DeepSeek四大降ai率指令+3款神器实测(保姆级教程)
  • 05_C 语言进阶之避坑指南:编译器优化等级 —— 嵌入式开发中被忽略的 “隐形陷阱”
  • 【笔记】ST 表
  • Flutter Bloc 状态管理深度解析与开源鸿蒙 ArkUI 对标分析
  • 【笔记】龟速乘与快速幂
  • 2025 最新家电维修平台 TOP5 评测!优质家电维修服务商榜单发布,数智化赋能 + 全城覆盖,品质服务重构家庭生活体验 - 全局中转站
  • GitLab与DeepSeek协同实现MR自动评审实践指南
  • CF 口胡记录
  • 2025最新家电维修/家电安装/租房/家政保洁/找房服务推荐——速达优家(微信小程序),一站式解决居家难题,优选平台实力护航 - 全局中转站
  • 基于springboot的档案数字化管理系统
  • B样条曲线根据曲率极值进行分段速度规划的方法介绍
  • 【笔记】最近公共祖先 Tarjan 算法
  • Spring的DI依赖注入(配置文件方式)
  • Office Tool Plus v10.29.50 office安装激活一条龙
  • 如何编写优美的代码:从工匠到艺术家的修炼之路
  • AI搜索焦虑自救指南:一份面向2026年的系统化追赶方案
  • 告别文件整理拖延症!快速找关键字 TXT + 批量复制到目标文件夹,躺平搞定
  • 《追问者宪章》完整版
  • 视频剪辑软件电脑版排行榜,2025年度前十名软件推荐
  • Error occurred during initialization of VMCould not reserve enough space for object heap
  • 东芝与Quantum Corridor实现量子安全网络通信重大突破
  • Qt Creator中pro文件添加外部动态库的方法
  • 芯祥联科技SNMP协议栈产品形态
  • 【笔记】线段树
  • 基于java的SpringBoot/SSM+Vue+uniapp的篮球管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
  • P3258 [JLOI2014] 松鼠的新家
  • K8S 中使用 YAML 安装 ECK
  • 23、深入解析 fwsnort 与 psad 的协同防御机制