poj3233——Matrix Power Series

本文介绍了一种使用矩阵快速幂算法来高效计算特定形式的矩阵表达式的方法。通过构造辅助矩阵并利用二分法进行幂运算,可以显著提高计算速度。文章提供了一个C++实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

矩阵乘法。

S = A + A2 + A3 + … + Ak ,把问题转化以加速,令

B =A I

0 I

则B^(k + 1) = A^(k + 1) I + A + A2 + A3 + … + Ak

0I

用二分法求B^(k + 1)

来源:http://archive.cnblogs.com/a/1960189/

#include<iostream> #include<cstdio> #include<cstring> using namespace std; class node { public: int matrix[66][66]; }ans,b; int n,m,k; void init(int n,int m) { int i,j; memset(ans.matrix ,0,sizeof(ans.matrix )); memset(b.matrix ,0,sizeof(b.matrix )); for(i=1;i<=n;i++) for(j=1;j<=n;j++) { scanf("%d",&ans.matrix [i][j]); ans.matrix [i][j]=ans.matrix [i][j]%m; b.matrix [i][j]=ans.matrix [i][j]; } for(i=1;i<=n;i++) {ans.matrix [i][n+i]=1; b.matrix [i][n+i]=1;} for(i=1+n;i<=n*2;i++) { ans.matrix [i][i]=1;b.matrix [i][i]=1;} } void mul(node &a,node &b) { node x; int i,k,j,sum; for(i=1;i<=n*2;i++) for(j=1;j<=n*2;j++) x.matrix[i][j]=a.matrix[i][j]; for(i=1;i<=n*2;i++) for(j=1;j<=n*2;j++) { sum=0; for(k=1;k<=n*2;k++) sum+=(x.matrix [i][k]*b.matrix [k][j]); a.matrix [i][j]=sum%m; } } void solve() { node a; int i,j; for(i=1;i<=n*2;i++) for(j=1;j<=n*2;j++) { a.matrix [i][j]=ans.matrix [i][j]; } mul(ans,a); } void work(int num) { if(num==1) return ; work(num/2); solve(); if(num%2==1) mul(ans,b); } int main() { int i,j; cin>>n>>k>>m; init(n,m); work(k+1); for(i=1;i<=n;i++) { if(ans.matrix [i][i+n]==0) ans.matrix [i][i+n]=m; ans.matrix [i][i+n]-=1; } for(i=1;i<=n;i++) { cout<<ans.matrix [i][n+1]; for(j=2+n;j<=n*2;j++) cout<<" "<<ans.matrix [i][j]; cout<<endl; } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值