标签:matrix
4 2 5 5 4 4 5 4 0 0 4 2 5 5 1 3 1 5 6 3 1 2 3 0 3 0 2 3 4 4 3 2 2 5 5 0 5 0 3 4 5 1 1 0 5 3 2 3 3 2 3 1 5 4 5 2 0 0
14 56
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 1005;
#define mod 6
struct Matrix
{
int mat[10][10];
} ;
Matrix unit_matrix, c;
int A[N][10], B[10][N], aa[N][10], bb[N][N];
int n, k;
Matrix mul(Matrix a, Matrix b) //矩阵相乘
{
Matrix res;
for(int i = 0; i < k; i++)
for(int j = 0; j < k; j++)
{
res.mat[i][j] = 0;
for(int t = 0; t < k; t++)
{
res.mat[i][j] += a.mat[i][t] * b.mat[t][j];
res.mat[i][j] %= mod;
}
}
return res;
}
Matrix pow_matrix(Matrix a, int m) //矩阵快速幂
{
Matrix res = unit_matrix;
while(m != 0)
{
if(m & 1)
res = mul(res, a);
a = mul(a, a);
m >>= 1;
}
return res;
}
int main()
{
int i, j, t;
while(~scanf("%d%d",&n,&k) && (n+k))
{
for(i = 0; i < n; i++)
for(j = 0; j < k; j++)
scanf("%d",&A[i][j]);
for(i = 0; i < k; i++)
for(j = 0; j < n; j++)
scanf("%d",&B[i][j]);
//初始化单位矩阵
for(i = 0; i < k; i++)
for(j = 0; j < k; j++)
unit_matrix.mat[i][j] = 0;
for(i = 0; i < n; i++)
unit_matrix.mat[i][i] = 1;
for(i = 0; i < k; i++) //求B*A
{
for(j = 0; j < k; j++)
{
c.mat[i][j] = 0;
for(t = 0; t < n; t++)
{
c.mat[i][j] += B[i][t] * A[t][j];
c.mat[i][j] %= mod;
}
}
}
Matrix ans = pow_matrix(c, n*n-1);
for(i = 0; i < n; i++)
{
for(j = 0; j < k; j++)
{
aa[i][j] = 0;
for(t = 0; t < k; t++)
{
aa[i][j] += A[i][t] * ans.mat[t][j];
aa[i][j] %= mod;
}
}
}
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
bb[i][j] = 0;
for(t = 0; t < k; t++)
{
bb[i][j] += aa[i][t] * B[t][j];
bb[i][j] %= mod;
}
}
}
int sum = 0;
for(i = 0; i < n; i++)
for(j = 0; j <n; j++)
sum += bb[i][j];
printf("%d\n", sum);
}
return 0;
}hdu 4965 Fast Matrix Calculation(矩阵快速幂)2014多校训练第9场,布布扣,bubuko.com
hdu 4965 Fast Matrix Calculation(矩阵快速幂)2014多校训练第9场
标签:matrix
原文地址:http://blog.csdn.net/lyhvoyage/article/details/38708767