51nod 1113 矩陣連乘快速冪模板 (對100000007取模)
阿新 • • 發佈:2019-02-10
#include<cstdio> #include<cmath> #include<algorithm> #define ll long long #define M 1000000007 using namespace std; const int maxn=105; int N; struct mat{ ll m[maxn][maxn]; }; mat A,I; void init(){ for(int i=0;i<N;i++) for(int j=0;j<N;j++){ scanf("%lld",&A.m[i][j]); A.m[i][j]%=M; I.m[i][j]=(i==j); } } mat multi(mat a,mat b){ mat c; for(int i=0;i<N;i++) for(int j=0;j<N;j++){ c.m[i][j]=0; for(int k=0;k<N;k++) c.m[i][j]+=a.m[i][k]*b.m[k][j]%M; c.m[i][j]%=M; } return c; } mat power(mat A,int k){ mat ans=I,p=A; while(k){ if(k&1){ ans=multi(ans,p); k--; } k>>=1; p=multi(p,p); } return ans; } int main(){ int k; scanf("%d%d",&N,&k); init(); mat ans=power(A,k); for(int i=0;i<N;i++){ printf("%lld",ans.m[i][0]); for(int j=1;j<N;j++) printf(" %lld",ans.m[i][j]); printf("\n"); } return 0; }