【模板】矩阵快速幂
题目描述
给定n*n的矩阵A,求A^k
输入输出格式
输入格式:
第一行,n,k
第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素
输出格式:
输出A^k
共n行,每行n个数,第i行第j个数表示矩阵第i行第j列的元素,每个元素模10^9+7
输入输出样例
输入样例#1:
2 1 1 1 1 1
输出样例#1:
1 1 1 1
说明
n<=100, k<=10^12, |矩阵元素|<=1000 算法:矩阵快速幂
1 #include <algorithm> 2 #include <iostream> 3 #include <cstdlib> 4 #include <cstring> 5 #include <cstdio> 6 #include <cmath> 7 using namespace std; 8 typedef long long ll; 9 const int N=105,mod=1000000007; 10 int n;ll k; 11 struct mat{ 12 ll a[N][N]; 13 inline mat operator *(const mat &b)const{ 14 mat tmp; 15 for(int i=1;i<=n;i++) 16 for(int j=1;j<=n;j++) 17 { 18 tmp.a[i][j]=0; 19 for(int k=1;k<=n;k++) 20 tmp.a[i][j]+=a[i][k]*b.a[k][j],tmp.a[i][j]%=mod; 21 } 22 return tmp; 23 } 24 }a; 25 mat qm(mat a,ll k){ 26 mat tmp=a;k--; 27 while(k){ 28 if(k&1)tmp=tmp*a; 29 k>>=1;a=a*a; 30 } 31 return tmp; 32 } 33 int main() 34 { 35 36 scanf("%d%lld",&n,&k); 37 for(int i=1;i<=n;i++) 38 for(int j=1;j<=n;j++) 39 scanf("%lld",&a.a[i][j]); 40 a=qm(a,k); 41 for(int i=1;i<=n;i++){ 42 for(int j=1;j<=n;j++) 43 printf("%lld ",a.a[i][j]); 44 puts(""); 45 } 46 return 0; 47 }