HDU 1575 Tr A

来源:互联网 发布:淘宝联盟登不了怎么办 编辑:程序博客网 时间:2024/06/05 14:55

Tr A

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 89 Accepted Submission(s): 68 
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
 
Author
题目大意:

如题。

思路:

题目很清楚,矩阵连续幂运算。

AC代码:

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int mod=9973;int n,k;struct Matrix{    int arr[12][12];};Matrix init,unit;Matrix Mul(Matrix a,Matrix b){    Matrix c;    for(int i=0; i<n; i++)        for(int j=0; j<n; j++)        {            c.arr[i][j]=0;            for(int k=0; k<n; k++)                c.arr[i][j]=(c.arr[i][j]+a.arr[i][k]*b.arr[k][j]%mod)%mod;            c.arr[i][j]%=mod;        }    return c;}Matrix Pow(Matrix a,Matrix b,int x){    while(x)    {        if(x&1)        {            b=Mul(b,a);        }        x>>=1;        a=Mul(a,a);    }    return b;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&k);        for(int i=0; i<n; i++)            for(int j=0; j<n; j++)            {                scanf("%d",&init.arr[i][j]);                unit.arr[i][j]=init.arr[i][j];            }        Matrix res=Pow(init,unit,k-1);        int ans=0;        for(int i=0; i<n; i++)            ans=(ans+res.arr[i][i])%mod;        printf("%d\n",ans%mod);    }    return 0;}


0 0
原创粉丝点击