首页 > 代码库 > HDU 1575 Tr A 矩阵快速幂

HDU 1575 Tr A 矩阵快速幂

跟着cxlove的矩阵专题(http://blog.csdn.net/ACM_cxlove/article/details/7815594)刷的,一道一道来。

最裸的题目,直接快速幂算就好了。

#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <stack>#include <map>#include <set>#include <climits>#include <iostream>#include <string>using namespace std; #define MP make_pair#define PB push_backtypedef long long LL;typedef unsigned long long ULL;typedef vector<int> VI;typedef pair<int, int> PII;typedef pair<double, double> PDD;const int INF = INT_MAX / 3;const double eps = 1e-8;const LL LINF = 1e17;const double DINF = 1e60;const int maxn = 15;const int mod = 9973;struct Matrix {    int n, m, data[maxn][maxn];    Matrix(int n = 0, int m = 0): n(n), m(m) {        memset(data, 0, sizeof(data));    }    void print() {        for(int i = 1; i <= n; i++) {            for(int j = 1; j <= m; j++) {                printf("%d ", data[i][j]);            }            puts("");        }    }};Matrix operator * (Matrix a, Matrix b) {    int n = a.n, m = b.m;    Matrix ret(n, m);    for(int i = 1; i <= n; i++) {        for(int j = 1; j <= m; j++) {            for(int k = 1; k <= a.m; k++) {                ret.data[i][j] += a.data[i][k] * b.data[k][j];                ret.data[i][j] %= mod;            }        }    }    return ret;}Matrix pow(Matrix mat, int k) {    if(k == 1) return mat;    Matrix ret = pow(mat * mat, k / 2);    if(k & 1) ret = ret * mat;    return ret;}Matrix mat;int n, k;int main() {    int T; scanf("%d", &T);    while(T--) {        scanf("%d%d", &n, &k);        mat.n = mat.m = n;        for(int i = 1; i <= n; i++) {            for(int j = 1; j <= n; j++) {                scanf("%d", &mat.data[i][j]);            }        }        mat = pow(mat, k);        int ans = 0;        for(int i = 1; i <= n; i++) {            ans = (ans + mat.data[i][i]) % mod;        }        printf("%d\n", ans);    }    return 0;}

  

HDU 1575 Tr A 矩阵快速幂