问题描述
给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
例如:
A =
1 2
3 4
A的2次幂
7 10
15 22
输入格式
第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数
接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值
输出格式
输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开
样例输入
2 2
1 2
3 4
样例输出
7 10
15 22
解:矩阵乘法满足结合律,所以也可以用快速幂
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <vector> #include <cmath> #include <queue> #include <deque> #include <cmath> #include <map> using namespace std; typedef long long ll; #define INF 0x7fffffff const double inf=1e20; const int maxn=1000+10; const int mod=1e7; const double pi=acos(-1); const int N=40,M=40; struct matrix{ int n,m; long long a[N][M]; matrix(){// 初始化2*2的单位矩阵 n=m=40; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ a[i][j]=0; } } for(int i=0;i<n;i++){ a[i][i]=1; } } void clear(int n_){ n=m=n_; //memset(a,0,sizeof(a)); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ a[i][j]=0; //if(i==j)a[i][j]=1; } } } void clear1(int n_){ n=m=n_; //memset(a,0,sizeof(a)); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ a[i][j]=0; if(i==j)a[i][j]=1; } } } matrix operator+(const matrix &b)const{ matrix tmp; tmp.clear(b.n); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ tmp.a[i][j]=a[i][j]+b.a[i][j]; } } return tmp; } matrix operator*(const matrix &b)const{ matrix tmp; tmp.clear(b.n); for(int i=0;i<n;i++){ for(int j=0;j<b.m;j++){ for(int k=0;k<m;k++){ tmp.a[i][j]=((a[i][k]*b.a[k][j])+tmp.a[i][j]); } } } return tmp; } }; matrix pow2(matrix A,int n){ matrix B; int nn=A.n; B.clear1(nn); while(n>0){ if(n&1)B=B*A; A=A*A; n/=2; } return B; } int main(){ matrix a,b; int n,m; scanf("%d%d",&n,&m); a.clear1(n); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ scanf("%lld",&a.a[i][j]); } } b=pow2(a,m); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ printf("%lld ",b.a[i][j]); } printf("\n"); } return 0; }
原文地址:https://www.cnblogs.com/wz-archer/p/12507570.html
时间: 2024-11-01 22:54:52