模板矩阵快速幂

Posted Driver_Lao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板矩阵快速幂相关的知识,希望对你有一定的参考价值。

洛谷 3390

技术分享图片
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define rg register
 5 #define N 110
 6 #define LL long long 
 7 using namespace std;
 8 const LL Mod=1e9+7;
 9 LL n,m,tmp[N][N];
10 struct Mat{LL m[N][N];}a,t,ans;
11 inline LL read(){
12     LL k=0,f=1; char c=getchar();
13     while(c<0||c>9)c==-&&(f=-1),c=getchar();
14     while(0<=c&&c<=9)k=k*10+c-0,c=getchar();
15     return k*f;
16 }
17 inline void mul(Mat &a,Mat b){
18     memset(tmp,0,sizeof(tmp));
19     for(rg int i=1;i<=n;i++)
20     for(rg int j=1;j<=n;j++)
21     for(rg int k=1;k<=n;k++)
22     tmp[i][j]+=a.m[i][k]*b.m[k][j],tmp[i][j]%=Mod;
23     for(rg int i=1;i<=n;i++)
24     for(rg int j=1;j<=n;j++)
25     a.m[i][j]=tmp[i][j];
26 }
27 int main(){
28     n=read(); m=read();
29     for(rg int i=1;i<=n;i++) 
30     for(rg int j=1;j<=n;j++) t.m[i][j]=read();
31     for(rg int i=1;i<=n;i++) ans.m[i][i]=1;
32     while(m){
33         if(m&1) mul(ans,t);
34         mul(t,t);
35         m>>=1;
36     }
37     for(rg int i=1;i<=n;i++){
38         for(rg int j=1;j<=n;j++) printf("%lld ",ans.m[i][j]);
39         puts("");
40     }
41     return 0;
42 } 
View Code

 

以上是关于模板矩阵快速幂的主要内容,如果未能解决你的问题,请参考以下文章

poj 3070 Fibonacci (矩阵快速幂乘/模板)

从矩阵快速幂的泛型模板设计——教你如何优雅的面向对象

模板矩阵快速幂

蒟阵P3390 模板矩阵快速幂

求幂大法,矩阵快速幂,快速幂模板题--hdu4549

矩阵快速幂 模板