矩阵快速幂 例3: 矩阵幂级数

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int n,k;
int a[4005][4005],b[4005][4005];int c[4005][4005],t[4005][4005];
void mu(int a[][4005],int b[][4005],int n){
memset(c,0,sizeof c);
for(int i=1;i<=2*n;i++){
for(int j=1;j<=2*n;j++){
for(int k=1;k<=2*n;k++){
c[i][j]+=a[i][k]*b[k][j];
c[i][j]%=1000;
}
}
}
for(int i=1;i<=2*n;i++){
for(int j=1;j<=2*n;j++){
    a[i][j]=c[i][j];
    //printf("%d ",a[i][j]);
   }
   //printf("\n");
}     
return;
}
void answer(int a[][4005],int k){
while(k){
if(n&1) mu(a,b,n);
mu(b,b,n);
k/=2;
}
}
int main(){
freopen("7.in","r",stdin);
freopen("7.out","w",stdout);
scanf("%d%d",&n,&k);
memset(a,0,sizeof a);
memset(b,0,sizeof b);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&a[i][j]);
b[i][j]=a[i][j];
b[n+i][j]=a[i][j];
}
}
//printf("%d\n",b[1][1]);
for(int i=n+1;i<=2*n;i++){
for(int j=n+1;j<=2*n;j++){
b[i][j]=1;
}
}
answer(a,k);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}

猜你喜欢

转载自blog.csdn.net/wcy2003/article/details/80953781