计算 ,并将M中每个元素对6取余再求和。
因为 ,n太大,直接对A*B形成的矩阵快速幂会暴时爆内存,但可对k*k进行矩阵快速幂。
将矩阵形式转变成: ,对B*A形成的矩阵快速幂即可。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int mod=6;
int N;
int a[1005][10],b[10][1005],c[10][1005],m[1005][1005];
struct matrix{
int x[7][7];
};
matrix multi(matrix a,matrix b){
matrix tmp;
memset(tmp.x,0,sizeof(tmp.x));
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
for(int k=1;k<=N;k++)
tmp.x[i][j]=(tmp.x[i][j]+a.x[i][k]*b.x[k][j])%mod;
return tmp;
}
matrix quick_multi(matrix a,int n){
matrix t;
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
t.x[i][j]=(i==j);
while(n){
if(n&1)
t=multi(t,a);
a=multi(a,a);
n>>=1;
}
return t;
}
int main(){
int n,k;
while(~scanf("%d%d",&n,&k)){
if(n==0&&k==0) break;
N=k;
for(int i=1;i<=n;i++)
for(int j=1;j<=k;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=k;i++)
for(int j=1;j<=n;j++)
scanf("%d",&b[i][j]);
matrix ans;
memset(ans.x,0,sizeof(ans.x));
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
for(int p=1;p<=n;p++) // B*A [k][k]
ans.x[i][j]=(ans.x[i][j]+b[i][p]*a[p][j])%mod;
ans=quick_multi(ans,n*n-1); //(B*A)^(n*n-1)
memset(c,0,sizeof(c));
for(int i=1;i<=k;i++)
for(int j=1;j<=n;j++)
for(int p=1;p<=k;p++) //(B*A)^(n*n-1)*B
c[i][j]=(c[i][j]+ans.x[i][p]*b[p][j])%mod;
memset(m,0,sizeof(m));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int p=1;p<=k;p++) //A*(B*A)^(n*n-1)*B
m[i][j]=(m[i][j]+a[i][p]*c[p][j])%mod;
int sum=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
sum+=m[i][j];
printf("%d\n",sum);
}
return 0;
}