当前位置: 首页 > 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.jsqmd.com/news/79311/

相关文章:

  • Flutter Bloc 状态管理深度解析与开源鸿蒙 ArkUI 对标分析
  • SpringBoot 企业级接口加密【通用、可配置、解耦的组件】「开闭原则+模板方法+拦截器/中间件模式」
  • 论文AI率90%→5%!DeepSeek四大降ai率指令+3款神器实测(保姆级教程)
  • 【笔记】ST 表
  • 从一维到二维:用Spire.XLS轻松将Python列表导出到Excel
  • 2026中专生不想做客服,如何提升自己?
  • 【笔记】矩阵快速幂
  • 【笔记】最近公共祖先 - 倍增
  • 2026大专建筑工程必看!这些证书让你找工作不踩雷!
  • 【笔记】龟速乘与快速幂
  • 这的确很棒
  • GitLab与DeepSeek协同实现MR自动评审实践指南
  • 2025最新家电安装平台TOP5评测!优质家电服务公司深度解析,安装数智化赋能+全国覆盖权威榜单发布,重构家居服务生态 - 全局中转站
  • CF 口胡记录
  • 产品经理资源合集
  • 行测教程资源合集
  • 【笔记】二分
  • 基于心电信号时空特征的QRS波检测算法的Matlab 2022a仿真
  • 基于springboot的档案数字化管理系统
  • 2025最新家电维修/家电安装/租房/家政保洁/找房服务推荐——速达优家(微信小程序),一站式解决居家难题,优选平台实力护航 - 全局中转站
  • B样条曲线根据曲率极值进行分段速度规划的方法介绍
  • Flutter Provider 状态管理深度解析与开源鸿蒙 ArkUI 状态管理对比
  • mysql重装,3306端口占用问题解决
  • mysql重装,3306端口占用问题解决
  • 揭秘大规模供应链优化:自动化决策系统如何高效运转
  • 2026转行IT,学Python还是Java更好找工作?
  • XTOOL D9S 1-Year Update Service: Keep Your Tool Updated for European/American Vehicles
  • 伊沙佐米:治疗多发性骨髓瘤的靶向药物解析【海得康】
  • 【笔记】最近公共祖先 Tarjan 算法
  • 2025 最新家政保洁平台服务商 TOP5 评测!优质家政保洁服务公司深度解析,重构家居生活服务新生态 - 全局中转站