矩阵乘法

来源:互联网 发布:outdoor products 淘宝 编辑:程序博客网 时间:2024/06/06 06:42

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

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

首先练习了一下 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);

[cpp] view plain copy print?
  1. #include<iostream>  
  2. #include<cstring>  
  3. #include<cstdio>  
  4. using namespace std;  
  5. #define maxn 36  
  6. int n, k, m;  
  7. struct Mar  
  8. {  
  9.   int  map[maxn][maxn];  
  10.   void unit()  ///单位矩阵  
  11.   {  
  12.       for(int i=0;i<maxn;i++)  
  13.         map[i][i] = 1;  
  14.   }  
  15.   void zero() ///零矩阵  
  16.   {  
  17.       memset(map,0,sizeof(map));  
  18.   }  
  19. }x;  
  20. Mar operator +(const Mar &a,const Mar &b)  
  21. {  
  22.     Mar tmp;  
  23.     tmp.zero();  
  24.     int i,j;  
  25.     for(i=0;i<n;i++)  
  26.     for(j=0;j<n;j++){  
  27.         tmp.map[i][j] =a.map[i][j] + b.map[i][j];  
  28.         if(tmp.map[i][j]>=m) tmp.map[i][j]%=m;  
  29.     }  
  30.     return tmp;  
  31. }  
  32. Mar operator *(const Mar &a,const Mar &b)  
  33. {  
  34.     Mar tmp;  
  35.     tmp.zero();  
  36.     int i,j,k;  
  37.     for(k=0;k<n;k++)  
  38.     for(i=0;i<n;i++)  
  39.       ///  if(a.map[i][k])  
  40.     for(j=0;j<n;j++){  
  41.          tmp.map[i][j] += a.map[i][k] * b.map[k][j];  
  42.          if(tmp.map[i][j]>=m)  
  43.         tmp.map[i][j]%=m;  
  44.     }  
  45.     return tmp;  
  46. }  
  47. Mar operator ^ (Mar x,int n)  
  48. {  
  49.     Mar tmp;  
  50.     tmp.zero();  
  51.     tmp.unit();  
  52.     while(n){  
  53.         if(n%2==1) tmp = tmp *x;  
  54.         n/=2;  
  55.         x = x*x;  
  56.     }  
  57.     return tmp;  
  58. }  
  59. Mar sum(int n)  
  60. {  
  61.     if(n==1) return x;  
  62.     else {  
  63.         Mar tmp = sum(n/2);  
  64.         if(n%2==1){  
  65.             Mar tmp2 = x ^ ((n/2)+1);  
  66.             return tmp + tmp2 + tmp*tmp2;  
  67.         }  
  68.         else {  
  69.             Mar tmp2 = x ^ (n/2);  
  70.             return tmp + tmp * tmp2;  
  71.         }  
  72.     }  
  73. }  
  74. int main()  
  75. {  
  76.     while(~scanf("%d%d%d",&n,&k,&m))  
  77.     {  
  78.         int i,j;  
  79.         for(i=0;i<n;i++)  
  80.         for(j=0;j<n;j++){  
  81.             scanf("%d",&x.map[i][j]);  
  82.             x.map[i][j]%=m;  
  83.         }  
  84.         Mar y = sum(k);  
  85.         for(i=0;i<n;i++)  
  86.         for(j=0;j<n;j++){  
  87.             printf("%d%c",y.map[i][j],j==n-1?'\n':' ');  
  88.         }  
  89.         break;  
  90.     }  
  91.     return 0;  

0 0