给你一个n*n的矩阵,
,
求其矩阵的k次幂,即Pk
第一行,一个整数T(0<T<=10),表示要求矩阵的个数。
接下来有T组数据,每组数据格式如下:
第一行:两个数据n(2<=n<=10)、k(1<=k<=5),两个数字之间用一个空格隔开,其中n表示状况空间的总数,k表示待求的转移概率矩阵的步数。接下来有n行n列个正整数,其中,第i行第j列表示pij,(0<=pij<=10)。另外,数据保证最后结果不会超过10^8。
输出为T组数据。
每组数据为已知矩阵的k次幂,格式为:
n行n列个正整数,每行数之间用空格隔开,注意,每行最后一个数后面不应该有多余的空格。
152 93 93 111 97
解题思路
将每次幂的结果存放在S数组中,让S数组和a数组相乘得到新的S数组。
C++代码
#include<iostream> #include<stdio.h> #include<stdlib.h> using namespace std; const int MAX=10; int main() { int T,n,k,i,j,m,s; int a[MAX][MAX]; scanf("%d",&T); while(T--) { int sum[MAX][MAX]={0} ; scanf("%d %d",&n,&k); for(i=0;i<n;i++) for(j=0;j<n;j++) { scanf("%d",&a[i][j]); sum[i][j]=a[i][j]; } for(m=2;m<=k;m++) { int temp[MAX][MAX]={0}; { for(i=0;i<n;i++) { for(j=0;j<n;j++) for(s=0;s<n;s++) { temp[i][j]+=sum[i][s]*a[s][j]; } } for(i=0;i<n;i++) for(j=0;j<n;j++) { sum[i][j]=temp[i][j]; } } } for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%d",sum[i][j]); if(j<n-1) printf(" "); } printf("\n"); } } return 0; }