模板矩阵快速幂

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;
 
View Code

 

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

模板矩阵快速幂

快速幂和矩阵快速幂模板

LuoguP3390|模板矩阵快速幂|板子

矩阵快速幂 模板

[模板] 矩阵快速幂

矩阵快速幂+实际应用--P3390 模板矩阵快速幂,P3938 斐波那契