码迷,mamicode.com
首页 > 其他好文 > 详细

关于数论【矩阵乘法】

时间:2017-09-23 18:50:45      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:矩阵乘法   memset   经典题目   clu   题目   span   今天   font   关于   

今天下午刷jingjing的矩乘题,搞得我肾虚。。按照现在所学,大概总结一下。
矩乘的运算是这样的,左边的第一行和右边的第一列乘积后加在答案的第一行第一列,由此类推。

Matrix matrix_cheng(Matrix a,Matrix b)
{
    Matrix c;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)
                c.mp[i][j]=(c.mp[i][j]+a.mp[i][k]*b.mp[k][j])%1000000007LL;
    return c;
}

一般矩阵乘法会和快速幂一起用,矩阵加速解决一些一维一边推,或者范围较小的二维一边推的DP题目,以及一些有循环节的题目。总之,就是根据不变的公式一般的规律,来利用快速幂加速。

建议学习的同学去做Matrix67: 十个利用矩阵乘法解决的经典题目,这里就不一一列举了。

给出一个矩乘快速幂的模板:

 

#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
struct Matrix
{
    LL mp[20][20];
    Matrix()
    {
        memset(mp,0,sizeof(mp));
    }
}A,ans;
int n,k;
Matrix matrix_cheng(Matrix a,Matrix b)
{
    Matrix c;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)
                c.mp[i][j]=(c.mp[i][j]+a.mp[i][k]*b.mp[k][j])%1000000007LL;
    return c;
}
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)scanf("%lld",&A.mp[i][j]);
        ans.mp[i][i]=1;
    }
    
    while(k!=0)
    {
        if(k%2==1)ans=matrix_cheng(ans,A);
        k/=2;A=matrix_cheng(A,A);
    }
    
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<n;j++)printf("%lld ",ans.mp[i][j]);
        printf("%lld\n",ans.mp[i][n]);
    }
    return 0;
}

 

关于数论【矩阵乘法】

标签:矩阵乘法   memset   经典题目   clu   题目   span   今天   font   关于   

原文地址:http://www.cnblogs.com/AKCqhzdy/p/7581680.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!