hdu - 1575 - Tr A(矩阵快速幂)

来源:互联网 发布:word转jpg软件 编辑:程序博客网 时间:2024/05/29 17:55

题意:求矩阵A的k次幂的主对角线上元素和模9973((2 <= 矩(方)阵维数n <= 10)和k(2 <= k < 10^9))。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1575

——>>矩阵快速幂。。。

#include <cstdio>#include <cstring>using namespace std;const int maxn = 10 + 5;const int mod = 9973;int n, k;struct Mar{    int m[maxn][maxn];    Mar(){        memset(m, 0, sizeof(m));    }};Mar operator + (Mar a, Mar b){    Mar ret;    for(int i = 0; i < n; i++)        for(int j = 0; j < n; j++) ret.m[i][j] = (a.m[i][j] + b.m[i][j]) % mod;    return ret;}Mar operator * (Mar a, Mar b){    Mar ret;    for(int i = 0; i < n; i++)        for(int j = 0; j < n; j++)            for(int l = 0; l < n; l++) ret.m[i][j] = (ret.m[i][j] + a.m[i][l] * b.m[l][j]) % mod;    return ret;}Mar pow_mod(Mar a, int n){    if(n == 1) return a;    Mar x = pow_mod(a, n/2);    x = x * x;    if(n&1) x = x * a;    return x;}void solve(){    Mar A;    int i, j, ret = 0;    for(i = 0; i < n; i++)        for(j = 0; j < n; j++) scanf("%d", &A.m[i][j]);    A = pow_mod(A, k);    for(i = 0; i < n; i++) ret = (ret + A.m[i][i]) % mod;    printf("%d\n", ret);}int main(){    int T;    scanf("%d", &T);    while(T--){        scanf("%d%d", &n, &k);        solve();    }    return 0;}


原创粉丝点击