[矩阵快速幂]hdu1575 Tr A

来源:互联网 发布:数据库三大范式详解 编辑:程序博客网 时间:2024/05/17 04:28

hdu1575 Tr A

题意:
求矩阵A的k次幂,主对角线之和%9973
思路:
裸的矩阵快速幂,具体见模板

代码:

/**************************************************************    Problem: HDU_1575    User: soundwave    Language: C++    Result: Accepted    Time: 0ms    Memory: 1576KB****************************************************************///#pragma comment(linker, "/STACK:1024000000,1024000000")#include <iostream>#include <stdio.h>#include <vector>using namespace std;typedef vector<int> Vint;typedef vector<Vint> VVint;typedef __int64 LL;const int MOD = 9973;//矩阵乘法VVint calc(VVint &A, VVint &B){    VVint C(A.size(),Vint(A.size()));    for(int i=0; i<A.size(); i++)    for(int j=0; j<B[0].size(); j++)    for(int k=0; k<B.size(); k++)        C[i][j] = (C[i][j] + (A[i][k]*B[k][j])) % MOD;    return C;}//二分快速幂VVint my_pow(VVint &A, int c){    VVint B(A.size(),Vint(A.size()));    for(int i=0; i<A.size(); i++)        B[i][i] = 1;    if(c==1) return A;    while(c>0){        if(c&1) B = calc(B,A);        A = calc(A,A);        c>>=1;    }    return B;}int main(){    int t, n, k;    scanf("%d", &t);    while(t-->0){        scanf("%d%d", &n, &k);        VVint A(n,Vint(n));        for(int i=0; i<n; i++)        for(int j=0; j<n; j++)            scanf("%d", &A[i][j]);        A = my_pow(A,k);        LL re=0;        for(int i=0; i<n; i++)            re += A[i][i];        printf("%I64d\n", re%MOD);    }    return 0;}


0 0
原创粉丝点击