1113 矩阵快速幂
Posted 早知如此绊人心,何如当初莫相识。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1113 矩阵快速幂相关的知识,希望对你有一定的参考价值。
给出一个N * N的矩阵,其中的元素均为正整数。求这个矩阵的M次方。由于M次方的计算结果太大,只需要输出每个元素Mod (10^9 + 7)的结果。
Input
第1行:2个数N和M,中间用空格分隔。N为矩阵的大小,M为M次方。(2 <= N <= 100, 1 <= M <= 10^9) 第2 - N + 1行:每行N个数,对应N * N矩阵中的1行。(0 <= N[i] <= 10^9)
Output
共N行,每行N个数,对应M次方Mod (10^9 + 7)的结果。
Input示例
2 3 1 1 1 1
Output示例
4 4 4 4
思路:模板
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int mod=1e9+7; 4 typedef long long ll; 5 int n,m; 6 struct prog 7 { 8 ll a[102][102]; 9 }; 10 prog s,B; 11 prog matrixmul(prog a,prog b) 12 { 13 prog c; 14 for(int i=1;i<=n;++i)for(int j=1;j<=n;++j) 15 { 16 c.a[i][j]=0; 17 for(int k=1;k<=n;k++) 18 c.a[i][j]+=(a.a[i][k]*b.a[k][j])%mod; 19 c.a[i][j]%=mod; 20 } 21 return c; 22 } 23 prog mul(prog s,int k) 24 { 25 prog ans; 26 for(int i=1;i<=n;++i)for(int j=1;j<=n;++j) ans.a[i][j]=(i==j)?1:0; 27 while(k){ 28 if(k&1) 29 ans=matrixmul(ans,s); 30 k>>=1; 31 s=matrixmul(s,s); 32 } 33 return ans; 34 } 35 36 int main(){ 37 scanf("%d%d",&n,&m); 38 prog s; 39 for(int i=1;i<=n;i++){ 40 for(int j=1;j<=n;j++) 41 scanf("%I64d",&s.a[i][j]); 42 } 43 s=mul(s,m); 44 for(int i=1;i<=n;i++){ 45 for(int j=1;j<=n;j++){ 46 printf("%I64d",(s.a[i][j]+mod)%mod); 47 if(j!=n) printf(" "); 48 } 49 printf("\n"); 50 } 51 }
以上是关于1113 矩阵快速幂的主要内容,如果未能解决你的问题,请参考以下文章