蒟阵P3390 模板矩阵快速幂
Posted lcezych
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蒟阵P3390 模板矩阵快速幂相关的知识,希望对你有一定的参考价值。
代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cmath> 5 #include<cstring> 6 #include<string> 7 #include<algorithm> 8 #include<time.h> 9 using namespace std; 10 #define mod 1000000007 11 #define ll long long 12 ll read(){ 13 ll ans=0; 14 char last=‘ ‘,ch=getchar(); 15 while(ch<‘0‘ || ch>‘9‘)last=ch,ch=getchar(); 16 while(ch>=‘0‘ && ch<=‘9‘)ans=ans*10+ch-‘0‘,ch=getchar(); 17 if(last==‘-‘)ans=-ans; 18 return ans; 19 }//快读 20 struct matrix{ 21 ll m[105][105]; 22 };//定义蒟阵 23 ll n,k; 24 matrix a,c,e; 25 matrix cheng(matrix x,matrix y)//定义蒟阵乘法 26 { 27 matrix c; 28 for(ll i=1;i<=n;i++) 29 for(ll j=1;j<=n;j++) 30 c.m[i][j]=0;//初始化0 31 for(int i=1;i<=n;i++) 32 for(int j=1;j<=n;j++) 33 for(int k=1;k<=n;k++) 34 { 35 c.m[i][j]=c.m[i][j]%mod+x.m[i][k]*y.m[k][j]%mod;//按照定义计算喽 36 } 37 return c; 38 } 39 matrix pow(matrix x,ll y)//定义蒟阵快速幂(注意要用蒟阵的乘法,其他相同) 40 { 41 matrix ans=e; 42 while(y) 43 { 44 if(y&1) 45 { 46 ans=cheng(ans,x); 47 } 48 x=cheng(x,x); 49 y>>=1; 50 } 51 return ans; 52 } 53 int main() 54 { 55 n=read(),k=read(); 56 for(ll i=1;i<=n;i++) 57 e.m[i][i]=1;//单位蒟阵 58 for(ll i=1;i<=n;i++) 59 for(ll j=1;j<=n;j++) 60 { 61 a.m[i][j]=read();//读入 62 } 63 matrix ans=pow(a,k); 64 for(ll i=1;i<=n;i++) 65 { 66 for(ll j=1;j<=n;j++) 67 { 68 cout<<ans.m[i][j]%mod<<" "; 69 } 70 cout<<endl; 71 } 72 return 0;//结束喽 73 }
如果要写蒟阵乘法的话,稍微修改一下就可以了:
int main() { for(int i=1;i<=m;i++) for(int j=1;i<=n;j++) { c[i][j]=0; for(int k=1;i<=p;k++) c[i][j]+=a[i][k]*b[k][j]; } }
以上是关于蒟阵P3390 模板矩阵快速幂的主要内容,如果未能解决你的问题,请参考以下文章