算法笔记--矩阵运算

来源:互联网 发布:仿生材料知乎 编辑:程序博客网 时间:2024/05/21 10:30

矩阵类,以及相关运算的重载。

#include<bits/stdc++.h>using namespace std;typedef long long LL;#define MOD 10007struct Mat{    int n,m;    LL mat[9][9];};Mat operator *(Mat a,Mat b){    Mat c;    memset(c.mat,0,sizeof(c.mat));    c.n = a.n,c.m = b.m;    for(int i=1;i<=a.n;i++){        for(int j=1;j<=b.m;j++){            for(int k=1;k<=a.m;k++){                c.mat[i][j] += (a.mat[i][k]*b.mat[k][j])%MOD;                c.mat[i][j] %= MOD;                c.mat[i][j]  = (c.mat[i][j]+ MOD)%MOD;            }        }    }    return c;}Mat operator +(Mat a,Mat b){    Mat c;    memset(c.mat,0,sizeof(c.mat));    c.n = a.n,c.m = a.m;    for(int i=1;i<=a.n;i++){        for(int j=1;j<=a.m;j++){            c.mat[i][j] = (a.mat[i][j]+b.mat[i][j])%MOD;        }    }    return c;}Mat operator ^(Mat a,LL k){    Mat c;    memset(c.mat,0,sizeof(c.mat));    c.n = a.n,c.m = a.n;    for(int i=1;i<=a.n;i++)c.mat[i][i] = 1;    while(k){        if(k&1){            c = c*a;        }        a = a*a;        k>>=1;    }    return c;}void out(Mat a){    for(int i=1;i<=a.n;i++){        for(int j=1;j<=a.m;j++){            printf(j==a.m? "%I64d\n":"%I64d ",a.mat[i][j]);        }    }}LL quick_pow(LL a,LL b,LL p){    LL ret=1;    a%=p;    while(b){        if(b&1) ret=(ret*a)%p;        a=(a*a)%p;        b/=2;    }    return ret;}int main(){    return 0;}