九度OJ 1474 矩阵幂(高效算法)

来源:互联网 发布:java课程设计案例精编 编辑:程序博客网 时间:2024/06/05 15:59
题目1474:矩阵幂

时间限制:1 秒

内存限制:128 兆

特殊判题:

提交:2864

解决:1112

题目描述:

给定一个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
来源:
2012年北京邮电大学计算机研究生机试真题


#include<stdio.h>#include<stdlib.h>typedef struct Matrix{    int m[11][11];    int n;}Matrix;Matrix multiply(Matrix a,Matrix b){    int i,j,k;    Matrix c;    c.n=a.n;    for(i=1;i<=a.n;i++)        for(j=1;j<=b.n;j++)        {            c.m[i][j]=0;            for(k=1;k<=a.n;k++)                c.m[i][j]+=a.m[i][k]*b.m[k][j];        }    return c;}int main(){    int total;    while(scanf("%d",&total)!=EOF)    {     while(total--)     {      int n,k;      scanf("%d%d",&n,&k);      int flag=0;      Matrix matrix,matrixa;      matrix.n=n;      int i,j;      for(i=1;i<=n;i++)        for(j=1;j<=n;j++)            scanf("%d",&matrix.m[i][j]);     matrixa=matrix;     if(k&1&&k!=1) flag=1;     while(k!=1)     {        matrix=multiply(matrix,matrix);        k/=2;     }     if(flag)     matrix=multiply(matrix,matrixa);     for(i=1;i<=matrix.n;i++)     {        for(j=1;j<=matrix.n;j++)      {        printf("%d",matrix.m[i][j]);        if(j!=matrix.n)           printf(" ");      }       printf("\n");     }     }    }  return 0;}




1 0