矩阵乘法

来源:互联网 发布:天刀男神太白捏脸数据 编辑:程序博客网 时间:2024/04/29 04:42

【矩阵乘法入门】  http://blog.csdn.net/mig_davidli/article/details/8601304;

【算法学习 矩阵乘法及其应用_百度文库.】 http://wenku.baidu.com/view/4bbbf1c38bd63186bcebbc80.html;

这算是我个人的学习笔记吧,再简单的看了【矩阵乘法入门以后】,去百度文库上查了下矩阵乘法的应用,挺不错的。

首先练习了一下 poj  3233 。 http://poj.org/problem?id=3233;

 这道题的矩阵求和 应用了两次二分,很灵活。 

题意 : S = A^1 + A^2 + A^3 + ... + A^k;

因为   A^4  = A^A^A^A =( A^2 ) ^2;  所以可以应用二分求解 A^x;

又因为 A^1 + A^2 + A^3 + A^4 + A^5 + A^6 +A^7 = (A^1 + A^2 + A^3) + A^4+A^4*(A^1 + A^2 + A^3);

#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define maxn 36int n, k, m;struct Mar{  int  map[maxn][maxn];  void unit()  ///单位矩阵  {      for(int i=0;i<maxn;i++)        map[i][i] = 1;  }  void zero() ///零矩阵  {      memset(map,0,sizeof(map));  }}x;Mar operator +(const Mar &a,const Mar &b){    Mar tmp;    tmp.zero();    int i,j;    for(i=0;i<n;i++)    for(j=0;j<n;j++){        tmp.map[i][j] =a.map[i][j] + b.map[i][j];        if(tmp.map[i][j]>=m) tmp.map[i][j]%=m;    }    return tmp;}Mar operator *(const Mar &a,const Mar &b){    Mar tmp;    tmp.zero();    int i,j,k;    for(k=0;k<n;k++)    for(i=0;i<n;i++)      ///  if(a.map[i][k])    for(j=0;j<n;j++){         tmp.map[i][j] += a.map[i][k] * b.map[k][j];         if(tmp.map[i][j]>=m)        tmp.map[i][j]%=m;    }    return tmp;}Mar operator ^ (Mar x,int n){    Mar tmp;    tmp.zero();    tmp.unit();    while(n){        if(n%2==1) tmp = tmp *x;        n/=2;        x = x*x;    }    return tmp;}Mar sum(int n){    if(n==1) return x;    else {        Mar tmp = sum(n/2);        if(n%2==1){            Mar tmp2 = x ^ ((n/2)+1);            return tmp + tmp2 + tmp*tmp2;        }        else {            Mar tmp2 = x ^ (n/2);            return tmp + tmp * tmp2;        }    }}int main(){    while(~scanf("%d%d%d",&n,&k,&m))    {        int i,j;        for(i=0;i<n;i++)        for(j=0;j<n;j++){            scanf("%d",&x.map[i][j]);            x.map[i][j]%=m;        }        Mar y = sum(k);        for(i=0;i<n;i++)        for(j=0;j<n;j++){            printf("%d%c",y.map[i][j],j==n-1?'\n':' ');        }        break;    }    return 0;}






原创粉丝点击