模板矩阵快速幂
Posted jian-song
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板矩阵快速幂相关的知识,希望对你有一定的参考价值。
矩阵乘法
- 两个矩阵相乘的前提是前一个矩阵的列数等于后一个矩阵的行数
- 单位矩阵:
-对于n∗m的矩阵,它的单位矩阵大小为m∗m;对于m∗n的矩阵,它的单位矩阵大小为n∗n
-单位矩阵的元素非0即1,从左上角到右下角的对角线上元素皆为1,其他皆为0
- 代码:
#include<bits/stdc++.h> #define ll long long #define For(i,l,r) for(int i=l;i<=r;i++) using namespace std; const int M=105,p=1e9+7; ll n,k; inline ll read() ll f=1,sum=0; char ch=getchar(); while(!isdigit(ch))if(ch==‘-‘)f=-1;ch=getchar(); while(isdigit(ch))sum=(sum<<1)+(sum<<3)+(ch^48);ch=getchar(); return f*sum; struct node ll a[M][M]; node() memset(a,0,sizeof(a)); inline void build()For(i,1,n)a[i][i]=1; mat,ans; node operator *(const node &x,const node &y)//重载运算符 node z; For(k,1,n) For(i,1,n) For(j,1,n) z.a[i][j]=(z.a[i][j]+x.a[i][k]*y.a[k][j]%p)%p; return z; inline void matksm() while(k) if(k&1) ans=ans*mat; mat=mat*mat; k>>=1; int main() n=read(),k=read(); For(i,1,n) For(j,1,n) mat.a[i][j]=read(); ans.build(); matksm();//与普通快速幂无异,只是不能写成*= For(i,1,n) For(j,1,n) printf("%d ",ans.a[i][j]); printf("\n"); return 0;
以上是关于模板矩阵快速幂的主要内容,如果未能解决你的问题,请参考以下文章