矩阵模板


#include<stdio.h>
#include<string.h>
#define D long long
#define N 109
#define MOD ((int)1e9+7)
struct matrix{
    int size;
    D mat[N][N];
    matrix(int s){
        size=s;memset(mat,0,sizeof(mat));
    }void init(){
        for(int i=1;i<=size;i++){
            for(int j=1;j<=size;j++){
                scanf("%lld",&mat[i][j]);
            }
        }
    }void out(){
        for(int i=1;i<=size;i++){
            for(int j=1;j<=size;j++){
                printf("%lld ",mat[i][j]);
            }printf("\n");
        }
    }matrix operator * (const matrix & x)const{
        matrix ans(x.size);
        for(int i=1;i<=x.size;i++){
            for(int j=1;j<=x.size;j++){
                for(int k=1;k<=x.size;k++){
                    ans.mat[i][j]=(ans.mat[i][j]+mat[i][k]*x.mat[k][j])%MOD;
                }
            }
        }return ans;
    }
} ;
/*
注释:假设非方阵
 1 2 * 3 相当于  1 2  *  3 0 
       4         0 0     4 0         
*/
matrix swift(matrix a,int t){
    matrix ans(a.size);
    for(int i=1;i<=a.size;i++)ans.mat[i][i]=1;
    while(t){
        if(t&1)ans=ans*a;
        a=a*a;t>>=1;
    }return ans;
}

int main(){
    matrix a(2),b(2),c(2);
    a.init();b.init();
    c=a*b;
    c.out();

    a.init();
    a=swift(a,3);
    a.out();
}

猜你喜欢

转载自blog.csdn.net/jk_chen_acmer/article/details/81130242
今日推荐