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

xiaoxiao2021-02-28  25

#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; }
转载请注明原文地址: https://www.6miu.com/read-2629131.html

最新回复(0)