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

有关矩阵快速幂

时间:2019-07-28 16:01:31      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:span   ems   com   sizeof   str   blank   等于   意思   code   

矩阵快速幂可以将O(n)的线性递推优化到O(log n), 是非常优秀的优化

做了许多题,感觉还好,学到了不少。

但是,做P2151 [SDOI2009]HH去散步 时,整个人都自闭了。自闭一个上午+一个中午后,下午终于想明白了。

AC后,写篇博客记录一下矩阵快速幂的有关事宜。

  1. 手写矩阵结构体,封装各种函数。
     1 struct Mar{
     2     int a[maxm][maxm],n;
     3     Mar (int _n=0) {n=_n;memset(a,0,sizeof a);}//不传参数默认为0
     4     Mar operator ~ () {for(int i=0;i<n;i++) a[i][i]=1;}//单位矩阵
     5     Mar operator * (const Mar &b) const {
     6         Mar c(n);
     7         for(int i=0;i<n;i++) for(int j=0;j<n;j++) for(int k=0;k<n;k++)
     8             c.a[i][j]=(c.a[i][j]+a[i][k]%mod*b.a[k][j]%mod)%mod;
     9         return c;
    10     }
    11     Mar operator ^ (int b){//快速幂
    12         Mar c(n),x=*this;~c;//  "*this" 有意思
    13         while(b){
    14             if(b&1) c=c*x;
    15             x=x*x;
    16             b>>=1;
    17         }
    18         return c;
    19     }
    20 };
  2. Mar ans(15) 表示开一个长宽为n的矩阵; Mar ans() 表示开一个长宽为0的矩阵。
  3. 矩阵乘法不满足交换律,要分清左乘与右乘;
  4. P2151 [SDOI2009]HH去散步 有点不同,把点的联通关系替换为边的联通关系,无向边二倍存储为单向边。我终于发现了矩乘的原理:技术图片      如图表示A*B=C

      看起来像三视图的感觉。彩色线表示长度是相等的,蓝色线是能相乘的条件。

      C中的第i行,第j列的值等于把A的第i行拿出来,B的第j列拿出来,放在一起顺次相乘 (就是和图中蓝线类似)。

      没了。。

有关矩阵快速幂

标签:span   ems   com   sizeof   str   blank   等于   意思   code   

原文地址:https://www.cnblogs.com/sdfzjdx/p/11258983.html

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