(矩阵快速幂)hdu1575 Tr A

来源:互联网 发布:艾瑞咨询数据 编辑:程序博客网 时间:2024/06/05 08:48

最简单的一道矩阵快速幂入门题,题意是求一个A矩阵的k次幂的迹(即主对角线的和)%9973的值,看懂模板了秒过——WA了无数次,一个多小时后,我对自己说道。

ac代码如下:

#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mod = 9973;const int maxn = 10;int cas, n, k;struct mat {    ll a[maxn][maxn];    mat() {//构造方法        memset(a, 0, sizeof(a));    }};void print(mat ans) {    for(int i = 0;i < n;i++) {        for(int j = 0;j < n;j++)            printf("%d ", ans.a[i][j]);        printf("\n");    }    return;}mat init() {//初始化    mat tt;    for(int i = 0;i < n;i++) {        for(int j = 0;j < n;j++) {            if(i == j)                tt.a[i][j] = 1;            else                tt.a[i][j] = 0;        }    }    return tt;}mat mul(mat x, mat y) {//乘法    mat tt;    for(int i = 0;i < n;i++) {        for(int j = 0;j < n;j++) {            tt.a[i][j] = 0;            for(int k = 0;k < n;k++) {                tt.a[i][j] += x.a[i][k] * y.a[k][j];            }            tt.a[i][j] %= mod;        }    }    return tt;}mat power(mat tt, int b) {//快速幂取模    mat res = init();    while(b) {        if(b & 1) {            res = mul(res, tt);        }        b >>= 1;        tt = mul(tt, tt);    }    return res;}int main() {    while(~scanf("%d", &cas)) {        while(cas--) {            mat ans;            scanf("%d %d", &n, &k);            for(int i = 0;i < n;i++)                for(int j = 0;j < n;j++) scanf("%d", &ans.a[i][j]);            ans = power(ans, k);            int sum = 0;            for(int i = 0;i < n;i++)                sum = (sum+ans.a[i][i]) % mod;            printf("%d\n", sum);        }    }    return 0;}


原创粉丝点击