【矩阵】备用模板

来源:互联网 发布:js onclick function 编辑:程序博客网 时间:2024/05/24 15:40


来自学长的矩阵模板


#include <cstdio>struct Mat {int N,M;int m[15][15];};// 有时由于内存的关系无需用结构体,直接定义多组数组即可 Mat MatMul(Mat A,Mat B,int MOD) { //两个相等矩阵的乘法,对于稀疏矩阵,有0处不用运算的优化Mat tmp;tmp.N=A.N;tmp.M=B.M;for(int i=0; i<A.N; i++) {for(int j=0; j<B.M; j++) {int sum=0;for(int k=0; k<B.N; k++)sum=(sum+A.m[i][k]*B.m[k][j])%MOD;tmp.m[i][j]=sum;}}/*    for(int i = 0; i < N; i++) {            for(int j = 0; j < m; j++) {                c[i][j] = 0;            }    }    for(int i = 0; i < N; i++) {        for(int k = 0; k < M; k++) {            if(a[i][k] == 0) continue;            for(int j = 0; j < m; j++) {                c[i][j] += a[i][k] * b[k][j];            }        }    }*/return tmp;}Mat MatPow(Mat mat,int n,int MOD) { //二分快速幂Mat ans;ans.N=ans.M=mat.N;for(int i=0; i<ans.N; i++)ans.m[i][i]=1;while(n) {if(n&1)ans=MatMul(ans,mat,MOD);mat=MatMul(mat,mat,MOD);n>>=1;}return ans;}int main() {Mat a,b;int n,m;scanf("%d %d",&n,&m);a.N=n;a.M=m;for(int i=0; i<n; i++)for(int j=0; j<m; j++) {scanf("%d",&a.m[i][j]);}scanf("%d %d",&n,&m);b.N=n;b.M=m;for(int i=0; i<n; i++)for(int j=0; j<m; j++)scanf("%d",&b.m[i][j]);Mat res;res=MatMul(a,b,10000000);for(int i=0; i<res.N; i++) {for(int j=0; j<res.M; j++) {printf("%d%c",res.m[i][j],j==res.M-1?'\n':' ');}}return 0;}


原创粉丝点击