矩阵的运算(HDU 1575)

来源:互联网 发布:lol美服mac版下载 编辑:程序博客网 时间:2024/04/29 18:15
Problem Description
A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。
 

Input
数据的第一行是一个T,表示有T组数据。
每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。
 

Output
对应每组数据,输出Tr(A^k)%9973。
 

Sample Input
22 21 00 13 999999991 2 34 5 67 8 9
 
Sample Output
22686
//1354591 2009-05-10 10:11:59 Accepted 1575 0MS 268K 1362 B C++ Wpl #include <iostream>#define MAX 11using namespace std;typedef struct node{    int matrix[MAX][MAX];//    int nn,mm;    //m代表行,n代表列}Matrix;Matrix init,unit;  //分别定义init为初始的输入矩阵,unit为单位矩阵int n,kk;void Init(){    int i,j;    scanf("%d%d",&n,&kk);    for(i=0;i<n;i++)        for(j=0;j<n;j++)        {            scanf("%d",&init.matrix[i][j]);  //输入初始矩阵            unit.matrix[i][j]=(i==j);  //初始化初始矩阵        }}Matrix Mul(Matrix a,Matrix b)//据说传结构体比传数组快{    int i,j,k;    Matrix c;    for(i=0;i<n;i++)        for(j=0;j<n;j++)        {            c.matrix[i][j] = 0;            for(k=0;k<n;k++)                c.matrix[i][j] += a.matrix[i][k]*b.matrix[k][j];            c.matrix[i][j]%=9973;        }    return c;}Matrix Cal(int k)//k代表幂,这里是利用二分法求矩阵的幂{    Matrix p,q;    p = unit;   //p为单位矩阵    q = init;   //q为初始矩阵    while(k!=1)    {        if(k&1)  //k是奇数        {            k--;            p = Mul(p,q);  //如果k是奇数,那么就不能进行平均的二分,所以让p乘以一个单位矩阵,保证其不变,然后k--就可以进行二分了        }        else  //k是偶数        {            k>>=1;  //k除2            q = Mul(q,q);        }    }    p = Mul(p,q);    return p;}int main(){    Matrix r;    int t;    cin>>t;    while(t--)    {        Init();        r=Cal(kk);        int i,j,sum;        i=0;        sum=0;        while(i<n)        {            sum+=r.matrix[i][i];            sum%=9973;            i++;        }        printf("%d\n",sum);    }    return 0;}


0 0
原创粉丝点击