题目1443:Tr A

来源:互联网 发布:手机淘宝分期付款流程 编辑:程序博客网 时间:2024/06/08 17:50
题目描述:

A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。

输入:

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

输出:

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

样例输入:
22 21 00 13 999999991 2 34 5 67 8 9

样例输出:
22686

代码:

#include <stdio.h>#define M 9973struct Matrix {    int m[11][11];};int n;Matrix mul(Matrix a, Matrix b) {    int i,j,k;    Matrix c;    for(i=1;i<=n;i++)        for(j=1;j<=n;j++) {            c.m[i][j] = 0;            for(k=1;k<=n;k++)                 c.m[i][j] += (a.m[i][k] * b.m[k][j]) % M;            c.m[i][j] %= M;        }    return c;}Matrix E;Matrix pow(Matrix a, int k) {    Matrix c = E;    while(k) {        if(k%2==1)            c = mul(c,a);        a = mul(a,a);        k /= 2;    }    return c;}                int main() {    int t,k;    while(scanf("%d",&t)!=EOF) {        int i,j,l;        for(i=0;i<t;i++) {            scanf("%d %d",&n,&k);            for(j=1;j<=n;j++)                for(l=1;l<=n;l++) {                    if(j==l)                        E.m[j][l] = 1;                    else                        E.m[j][l] = 0;                }            Matrix tmp;            for(j=1;j<=n;j++)                for(l=1;l<=n;l++)                    scanf("%d",&tmp.m[j][l]);            tmp = pow(tmp,k);            int ans=0;            for(j=1;j<=n;j++)                 ans += tmp.m[j][j] % M;            printf("%d\n",ans%M);        }    }    return 0;}


原创粉丝点击