矩阵(矩阵加速、矩阵快速幂)

开始写SMOI本学期总结——(先挑个简单的)

前置芝士:快速幂、重载运算符?

引入

矩阵 

直接理解成为一个二维数组即可

矩阵乘法

1、两个矩阵A和B相乘,前提是A的列数等于B的行数。

2、设矩阵A的大小是m*n, 矩阵B的大小是n*u,那么C=A*B的大小是m*u。

 矩阵乘法C=A*B的计算公式 :    $c[i][j]=\sum _{k=0}^{n-1}a[i][k]*b[k][j]$

3、矩阵乘法满足结合律,不满足交换律

4、   如果行数和列数相同的矩阵,可以称为方阵。

        如果方阵的对角线元素是1,其余元素都是0,那么这样的方阵就是单位矩阵,记为I ,满足            I*A=A   A*I=A

矩阵快速幂

矩阵快速幂跟普通快速幂没什么区别,只要写好重载,给出模板

struct matrix{
	int d[N][N];
	int row,col;
	matrix (int r,int c,bool isI){
		row=r,col=c;
		memset(d,0,sizeof d);
		if(isI){
			for(int i=0;i<row;i++) d[i][i]=1;
		}
	}
};
matrix operator * (const matrix &a,const matrix &b){
	matrix c(a.row,b.col,false);
	for(int i=0;i<a.row;i++) {
		for(int j=0;j<=b.col;j++){
			for(int k=0;k<=a.col;k++){
				c.d[i][j]=(c.d[i][j]+a.d[i][k]*b.d[k][j])%mod;
			}
		}
	}
	return c;
}
matrix qpow(matrix x,int k){
	matrix ans(x.row,x.col,true);
	while(k){
		if(k&1) ans=ans*x;
		x=x*x;
		k>>=1;
	}
	return ans;
}

应用

矩阵快速幂可以加速一些 dp 或 类dp 问题

大体思路 :看出dp,发现数据巨大且 dp转移柿子简单 果断考虑加速

1、easy

question:斐波那契数列让你求第 n 项,n<=1e9 

无法枚举,但发现类dp  $f[i]=f[i-1]+f[i-2]$ 

直接优化即可

2、矩阵套矩阵

question: 给出一个n*n的矩阵A,求A^1 + A^2 + A^3 + ... + A^k。

把矩阵看作整体,当数组,构造出转移矩阵         I  0

                                                                             A A

即可

矩阵与图论

结论 一个邻接矩阵A ,$T =A^M$ 后,T.d[i][j] 表示点 i 到点 j 经过 n条边 (n-1个点)的路径数量

证明 : 将M=1、2、3 算过之后发现成立,感性理解写柿子就能验证正确性

例题Luogu P2886

板子题,因为 A[i][j]表示 i 到 j 距离,T=A^n ,T[i][j] 就是 i 到 j 经过 n 条边 最短路长度

完结撒花 ……^^^^^……

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值