北邮oj129矩阵幂

在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define maxn 105
int buf[maxn][maxn];
int ans[maxn][maxn];
void get(int ans[][maxn],int n){
	//***********************调试了半个小时,一直不对,终于发现是因为
	//***********************不能直接用ans[][]参与计算,因为ans[][]的值是不断更新的,所以要用temp[][]暂存 
	int temp[maxn][maxn];//必须要有 
	for(int i=1;i<=n;i++){//赋值 
		for(int j=1;j<=n;j++){
			temp[i][j] = ans[i][j];
		}
	}
	//***********************关键,ans[i][j] = ∑temp[i][k]*temp[k][j] 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			int sum = 0;
			for(int k=1;k<=n;k++){
				sum += temp[i][k]*buf[k][j];
			}
			ans[i][j] = sum;
		}
	}

}
int main(){
	int T,n,k;
	
	scanf("%d",&T);
	while(T--){
		scanf("%d %d",&n,&k);//n为矩阵的行列数,k是阶数 
		for(int i=1;i<=n;i++){//buf[][]赋值 
			for(int j=1;j<=n;j++){
				scanf("%d",&buf[i][j]);
			}
		} 
		
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				ans[i][j] = buf[i][j];
			}
		} 
		
		
		if(k!=1){
			for(int i=1;i<k;i++){
				get(ans,n);
			}
		}
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(j==1)//空格判断 
				printf("%d",ans[i][j]);
				else
				printf(" %d",ans[i][j]);
				}
				printf("\n");
			}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_37762592/article/details/88592449