题目1474:矩阵幂

来源:互联网 发布:n9008v root软件 编辑:程序博客网 时间:2024/06/05 15:03
题目描述:

给定一个n*n的矩阵,求该矩阵的k次幂,即P^k。

输入:

输入包含多组测试数据。
数据的第一行为一个整数T(0<T<=10),表示要求矩阵的个数。
接下来有T组测试数据,每组数据格式如下: 
第一行:两个整数n(2<=n<=10)、k(1<=k<=5),两个数字之间用一个空格隔开,含义如上所示。
接下来有n行,每行n个正整数,其中,第i行第j个整数表示矩阵中第i行第j列的矩阵元素Pij且(0<=Pij<=10)。另外,数据保证最后结果不会超过10^8。

输出:

对于每组测试数据,输出其结果。格式为:
n行n列个整数,每行数之间用空格隔开,注意,每行最后一个数后面不应该有多余的空格。

样例输入:
32 29 89 33 34 8 49 3 03 5 75 24 0 3 0 10 0 5 8 58 9 8 5 39 6 1 7 87 2 5 7 3
样例输出:
153 96108 811216 1248 7081089 927 5041161 1151 73947 29 41 22 16147 103 73 116 94162 108 153 168 126163 67 112 158 122152 93 93 111 97
#include<iostream>#include<cstdio>using namespace std;int main() {int t;scanf("%d",&t);while(t--) {int n,k;scanf("%d%d",&n,&k);int array[13][13];int res[13][13];int tmp[13][13];for(int i=0; i<n; i++) {for(int j=0; j<n; j++) {scanf("%d",&array[i][j]);res[i][j]=array[i][j];tmp[i][j]=array[i][j];}}if(k==1) {for(int i=0; i<n; i++) {for(int j=0; j<n-1; j++) {printf("%d ",res[i][j]);}printf("%d\n",res[i][n-1]);}return 0;}for(int i=0; i<k/2; i++) {for(int j=0; j<n; j++) {for(int u=0; u<n; u++) {int c=0;for(int v=0; v<n; v++) {c+=array[j][v]*array[v][u];}res[j][u]=c;}}for(int s=0; s<n; s++) {for(int t=0; t<n; t++) {array[s][t]=res[s][t];}}}if(k%2==1) {for(int j=0; j<n; j++) {for(int u=0; u<n; u++) {int c=0;for(int v=0; v<n; v++) {c+=array[j][v]*tmp[v][u];}res[j][u]=c;}}}for(int i=0; i<n; i++) {for(int j=0; j<n-1; j++) {printf("%d ",res[i][j]);}printf("%d\n",res[i][n-1]);}}return 0;}
用了很笨的方法做的
一定要考虑到幂次是1的情况
原创粉丝点击