您的位置:首页 > 其它

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

2013-08-21 20:47 375 查看
题意:求矩阵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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: