您的位置:首页 > 其它

hdoj 1575 Tr A 【矩阵快速幂】

2014-11-25 23:43 411 查看

Tr A

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 3020 Accepted Submission(s): 2251

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
2
2 2
1 0
0 1
3 99999999
1 2 3
4 5 6
7 8 9




Sample Output
2
2686


分析:跟快速幂差不多,就是一个是数,一个是矩阵

代码:

#include <stdio.h>
#include <string.h>
#define mod 9973

struct node{
    int map[15][15];
};
node a, b;
int n;
node mul(node a, node b){
    node c;
    int i, j, k;
    for(i = 0; i < n; i ++)
        for(j = 0; j < n; j ++){
            c.map[i][j] = 0;
            for(k = 0; k < n; k ++)
                c.map[i][j] += a.map[i][k]*b.map[k][j];
                c.map[i][j] %= mod;
        }
    return c;
}

node f(int k, node a){
    b = a; k-=1;  //将
    while(k){
        if(k&1) b = mul(b, a);
        k>>=1;
        a = mul(a, a);
    }
    return b;
}

int main(){
    int t, k;
    scanf("%d", &t);
    while(t --){
        scanf("%d%d", &n, &k);
        int i, j;
        for(i = 0; i < n; i ++){
            for(j = 0; j < n; j ++){
                scanf("%d", &a.map[i][j]);
            }
        }
        node ans = f(k, a);
        int res = 0;
        for(i = 0; i < n; i ++) res += ans.map[i][i];
        printf("%d\n", res%mod);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: