矩阵快速幂
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int mod=1000000007; int n; long long k; long long read(){ long long x=0; int f=1; char c=getchar(); while(!isdigit(c)){ if(c=='-') f=-1; c=getchar(); } while(isdigit(c)){ x=(x<<3)+(x<<1)+(c^48); c=getchar(); } return x*f; } struct cube{ long long a[105][105]; cube(){ memset(a,0,sizeof(a)); } inline void build(){ for(int i=1;i<=n;i++) a[i][i]=1; } }A; cube operator*(const cube &l,const cube &r){ cube c; for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ c.a[i][j]+=((l.a[i][k]%mod)*(r.a[k][j]%mod))%mod; c.a[i][j]%=mod; } } } return c; } int main(){ n=read(); k=read(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) A.a[i][j]=read(); cube ans; ans.build(); while(k){ if(k&1) ans=ans*A; A=A*A; k>>=1; } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) printf("%lld ",ans.a[i][j]); puts(""); }return 0; }
主要就是关于重载运算符的问题,矩阵快速幂的思想等同于普通快速幂的思想,但矩阵乘法的“K”要放在两层循环外