有关矩阵快速幂
Posted sdfzjdx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有关矩阵快速幂相关的知识,希望对你有一定的参考价值。
矩阵快速幂可以将O(n)的线性递推优化到O(log n), 是非常优秀的优化
做了许多题,感觉还好,学到了不少。
但是,做P2151 [SDOI2009]HH去散步 时,整个人都自闭了。自闭一个上午+一个中午后,下午终于想明白了。
AC后,写篇博客记录一下矩阵快速幂的有关事宜。
- 手写矩阵结构体,封装各种函数。
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 ;
- Mar ans(15) 表示开一个长宽为n的矩阵; Mar ans() 表示开一个长宽为0的矩阵。
- 矩阵乘法不满足交换律,要分清左乘与右乘;
- P2151 [SDOI2009]HH去散步 有点不同,把点的联通关系替换为边的联通关系,无向边二倍存储为单向边。我终于发现了矩乘的原理: 如图表示A*B=C
看起来像三视图的感觉。彩色线表示长度是相等的,蓝色线是能相乘的条件。
C中的第i行,第j列的值等于把A的第i行拿出来,B的第j列拿出来,放在一起顺次相乘 (就是和图中蓝线类似)。
没了。。
以上是关于有关矩阵快速幂的主要内容,如果未能解决你的问题,请参考以下文章