模板【洛谷P3390】 【模板】矩陣快速冪
阿新 • • 發佈:2018-10-28
i++ pac get lld getchar () lin line its
P3390 【模板】矩陣快速冪
題目描述
給定n*n的矩陣A,求A^k
矩陣A的大小為n×m,B的大小為n×k,設C=A×B
則C_{i,j}=\sum\limits_{k=1}^{n}A_{i,p}×B_{p,j}
矩陣乘滿足結合律:(AB)C=A(BC)
有一種特殊的矩陣:單位矩陣,它從左上角到右下角的對角線上的元素均為1,除此以外全都為0。它在矩陣乘中相當於數乘中的1,即任何矩陣乘它都等於本身。
code:
#include <iostream> #include <cstdio> #include <cstring> #define int long long using namespace std; const int mod=1e9+7; const int wx=117; inline int read(){ int sum=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0'; ch=getchar();} return sum*f; } int n,k; struct mat{ int a[wx][wx]; mat(){memset(a,0,sizeof a);} void e(){for(int i=0;i<=n;i++)a[i][i]=1;} friend mat operator * (const mat & a,const mat & b){ mat c; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ for(int k=1;k<=n;k++){ c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%mod; } } } return c; } }a,ans; void ksm(mat aa,int b){ ans.e(); while(b){ if(b&1)ans=ans*aa; aa=aa*aa; b>>=1; } } signed main(){ n=read(); k=read(); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ a.a[i][j]=read(); } } ksm(a,k); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ printf("%lld ",ans.a[i][j]); } puts(""); } return 0; }
模板【洛谷P3390】 【模板】矩陣快速冪