很简单的一步推倒,(AB)^(n^2)=A(BA)^(n^2-1)B,这样就可以求BA的矩阵快速幂。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N=7;
const int MOD=6;
struct Matrix
{
int m[N][N];
} init;
int res1[1100][1100], res2[1100][1100], A[1100][7], B[7][1100];
Matrix Mult(Matrix m1, Matrix m2, int n)
{
Matrix ans;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
{
ans.m[i][j]=0;
for(int k=0; k<n; k++)
ans.m[i][j]=(ans.m[i][j]+m1.m[i][k]*m2.m[k][j])%MOD;
}
return ans;
}
Matrix Pow(Matrix m, int b, int n)
{
Matrix ans;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
ans.m[i][j]=i==j;
while(b)
{
if(b&1)
ans=Mult(ans, m, n);
m=Mult(m, m, n);
b>>=1;
}
return ans;
}
int main()
{
// freopen("in.txt", "r", stdin);
int n, k;
while(~scanf("%d%d", &n, &k) && n+k)
{
for(int i=0; i<n; i++)
for(int j=0; j<k; j++)
scanf("%d", &A[i][j]);
for(int i=0; i<k; i++)
for(int j=0; j<n; j++)
scanf("%d", &B[i][j]);
//计算BA
for(int i=0; i<k; i++)
for(int j=0; j<k; j++)
{
init.m[i][j]=0;
for(int l=0; l<n; l++)
init.m[i][j]=(B[i][l]*A[l][j]+init.m[i][j])%MOD;
}
//求BA的幂
init=Pow(init, n*n-1, k);
//res1=A(BA)^(n^2-1)
for(int i=0; i<n; i++)
for(int j=0; j<k; j++)
{
res1[i][j]=0;
for(int l=0; l<k; l++)
res1[i][j]=(res1[i][j]+A[i][l]*init.m[l][j])%MOD;
}
int ans=0;
//res2=res1*b
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
{
res2[i][j]=0;
for(int l=0; l<k; l++)
res2[i][j]=(res2[i][j]+res1[i][l]*B[l][j])%MOD;
ans+=res2[i][j];
}
printf("%d\n", ans);
}
return 0;
}