矩阵乘法及矩阵快速幂模板

42人阅读 评论(0) 收藏 举报
分类:
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cstdio>

using namespace std;
typedef long long LL;
//自行修改,矩阵的最大值和模值
const int maxn=105;
const int Mod=100009;

struct Matrix {
    int m[maxn][maxn];
};

//矩阵乘法(a矩阵n*t   b矩阵t*m)
Matrix Mul(Matrix a,Matrix b,int n,int t,int m) {
    Matrix res;
    memset(res.m,0,sizeof(res.m));
    for(int j=0;j<t;j++) {//a的列数,b的行数

        for(int i=0;i<n;i++) {//a的行数
            if(!a.m[i][j])continue;

            for(int k=0;k<m;k++) {//b的列数
                if(!b.m[j][k])continue;

                res.m[i][k]=(res.m[i][k]+a.m[i][j]*b.m[j][k])%Mod;
            }
        }
    }
    return res;
}

//矩阵快速幂(n为阶数)
Matrix fastm(Matrix a,int b,int n) {
    Matrix s;
    memset(s.m,0,sizeof(s.m));
    for(int i=0;i<n;i++)
        s.m[i][i]=1;
    while(b) {
        if(b&1)
            s=Mul(s,a,n,n,n);
        a=Mul(a,a,n,n,n);
        b>>=1;
    }
    return s;
}

int main() {
    ios::sync_with_stdio(false);

    Matrix a,b,c,res;
    int n,t,m;
    cin>>n>>t>>m;
    for(int i=0;i<n;i++)
        for(int j=0;j<t;j++)
        cin>>a.m[i][j];

    for(int i=0;i<t;i++)
        for(int j=0;j<m;j++)
        cin>>b.m[i][j];

    c=Mul(a,b,n,t,m);

    cout<<endl;

    for(int i=0;i<n;i++) {
        for(int j=0;j<m;j++) {
            cout<<c.m[i][j]<<" ";
        }
        cout<<endl;
    }

    res=fastm(c,2,n);

    cout<<endl;
    for(int i=0;i<n;i++) {
        for(int j=0;j<n;j++)
            cout<<res.m[i][j]<<" ";
        cout<<endl;
    }

    return 0;
}

/*
3 2 3
1 0
0 1
1 0

1 1 1
0 1 0

res:
1 1 1
0 1 0
1 1 1

*/

查看评论

矩阵乘法及矩阵快速幂运算

设矩阵为n*n(n&amp;lt;N)的矩阵,代码如下: const int N = 100; void matmul(long long a[][N], long long b[][N], long...
  • aaaliaosha
  • aaaliaosha
  • 2018-02-15 10:04:08
  • 63

矩阵快速幂总结

基础知识:(会基础的直接看应用部分)(1)矩阵乘法简单的说矩阵就是二维数组,数存在里面,矩阵乘法的规则:A*B=C其中c[i][j]为A的第i行与B的第j列对应乘积的和,即:代码:const int ...
  • wust_zzwh
  • wust_zzwh
  • 2016-11-25 15:40:18
  • 13481

矩阵乘法必用算法快速幂基础程序pascal

  • 2013年05月26日 14:46
  • 472B
  • 下载

快速幂与快速矩阵幂(以大数下的斐波那契数列为例)

一般地,a^n的算法时间复杂度为o(n),但是如果n为大数,则运行时间过长,效率不高。因此,使用二分的思想降低时间复杂度,使其降至o(logn),则会使运行效率较大提升。二分思想如下图所示。 例如:2...
  • carson0408
  • carson0408
  • 2017-08-30 22:03:07
  • 996

洛谷 P1939 【模板】矩阵加速(数列):优化递推式的方法——矩阵快速幂

在大多数情况下,O(n)的效率都是值得骄傲的,然而,有时候并不是,比如如何在一秒钟内算出一个递推式的第1e9项,很明显O(n)不行了。 然而常数级又不太现实,除非你的数学非常好,这题又比较简单,你推了...
  • qq_37666409
  • qq_37666409
  • 2017-12-15 19:49:08
  • 144

矩阵快速幂的JAVA实现

矩阵快速幂题目描述:给定一个n*n的矩阵,求该矩阵的k次幂,即P^k。**如何快速的算出一个矩阵的N次幂呢,举个例子,比如A^19 => (A^16)*(A^2)*(A^1)显然采取这样的方式计算时...
  • Rzty_it
  • Rzty_it
  • 2017-02-10 21:36:29
  • 1225

矩阵快速幂(总结)

转载自:点击打开链接 基础知识:(会基础的直接看应用部分) (1)矩阵乘法 简单的说矩阵就是二维数组,数存在里面,矩阵乘法的规则:A*B=C 其中c[i][j]为A的第i行与B的第...
  • Aiwen1413
  • Aiwen1413
  • 2016-12-03 15:41:30
  • 358

HDU 5318 (dp+矩阵快速幂优化)

The Goddess Of The Moon Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java...
  • wust_zzwh
  • wust_zzwh
  • 2015-07-29 16:20:02
  • 646

矩阵快速幂求斐波那契数列(初学整理)

参考文章:                  http://blog.csdn.net/u013795055/article/details/38599321                  htt...
  • NYIST_TC_LYQ
  • NYIST_TC_LYQ
  • 2016-10-31 13:27:45
  • 9277

【jzoj5335】【NOIP2017提高A组模拟8.24】【早苗】【矩阵乘法快速幂】

descriptionsolution设f[i][j]表示到第i天,往前j天不同的方案数,可以转移到f[i+1][k],当k...
  • chunkitlau
  • chunkitlau
  • 2017-08-24 11:39:23
  • 173
    个人资料
    持之以恒
    等级:
    访问量: 3276
    积分: 529
    排名: 9万+
    文章存档