【模板】矩阵快速幂
题目背景
矩阵快速幂
题目描述
给定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<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #define MOD 1000000007 6 #define LL long long 7 using namespace std; 8 LL a[105][105],b[105][105],c[105][105],k; 9 int n; 10 void inti() 11 { 12 scanf("%d%lld",&n,&k); 13 for (int i=1;i<=n;i++) 14 for (int j=1;j<=n;j++) scanf("%lld",&a[i][j]); 15 for (int i=1;i<=n;i++) b[i][i]=1; 16 } 17 void hc() 18 { 19 for(LL i=1;i<=n;i++) 20 for(LL j=1;j<=n;j++) 21 { 22 c[i][j]=0; 23 for(LL k=1;k<=n;k++) 24 c[i][j]=(c[i][j]+b[i][k]*a[k][j]%MOD)%MOD; 25 26 } 27 for(LL i=1;i<=n;i++) 28 for(LL j=1;j<=n;j++) 29 b[i][j]=c[i][j]; 30 } 31 void zc() 32 { 33 for(LL i=1;i<=n;i++) 34 for(LL j=1;j<=n;j++) 35 { 36 c[i][j]=0; 37 for(LL k=1;k<=n;k++) 38 c[i][j]=(c[i][j]+a[i][k]*a[k][j]%MOD)%MOD; 39 } 40 for(LL i=1;i<=n;i++) 41 for(LL j=1;j<=n;j++) 42 a[i][j]=c[i][j]; 43 } 44 void work() 45 { 46 while(k) 47 { 48 if(k%2==1) hc(); 49 zc(); 50 k=k/2; 51 } 52 for(LL i=1;i<=n;i++) 53 { 54 for(LL j=1;j<=n;j++) 55 cout<<b[i][j]<<" "; 56 cout<<endl; 57 } 58 } 59 int main() 60 { 61 inti(); 62 work(); 63 return 0; 64 }
以上 By LQ_double