题目链接:http: //acm.hdu.edu.cn/showproblem.php?pid=1575
要求矩阵的幂,可以将指数变为二进制的方法,如:R^17=R^(16)*R^(1); 即17的二进制10001,也在用递归的方法。下面是用二进制的方法, 代码如下
要求矩阵的幂,可以将指数变为二进制的方法,如:R^17=R^(16)*R^(1); 即17的二进制10001,也在用递归的方法。下面是用二进制的方法, 代码如下
#include<iostream>
#include<cstdio>
#include<math.h>
#define maxn 100
#define mod 9973
using namespace std;
struct Matrix {
int n, m;
int mat[maxn][maxn];
Matrix() {
n = m = maxn;
memset(mat, 0, sizeof(mat));
}
inline void init(int aa, int bb) {
n = aa;
m = bb;
}
inline void init_e(int aa, int bb) {
int i, j;
n = aa;
m = bb;
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
mat[i][j] = (i == j);
}
};
Matrix mul(Matrix a, Matrix b) //乘法
{
Matrix ret;
ret.init(a.n, b.m);
int i, j, k;
for (i = 0; i < a.n; i++) {
for (j = 0; j < b.m; j++)
if (a.mat[i][j]) {
for (k = 0; k < b.m; k++)
if (b.mat[j][k]) {
ret.mat[i][k] += a.mat[i][j] * b.mat[j][k];
if (ret.mat[i][k] >= mod
)
ret.mat[i][k] %= mod;
}
}
}
return ret;
}
Matrix mi(Matrix a, int b) //幂
{
Matrix ret = a, temp = a;
ret.init_e(a.n, a.m);
while (b) {
if (b & 1)
ret = mul(ret, temp);
temp = mul(temp, temp);
b >>= 1;
}
return ret;
}
int main() {
int cas;
scanf("%d", &cas);
while (cas--) {
int n, k;
int i, j;
scanf("%d%d", &n, &k);
Matrix a;
a.init_e(n, n);
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
scanf("%d", &a.mat[i][j]);
Matrix res = mi(a, k);
int cnt = 0;
for (i = 0; i < n; i++)
cnt += res.mat[i][i];
printf ("%d\n",cnt�73);
}
return 0;
}