开始写SMOI本学期总结——(先挑个简单的)
前置芝士:快速幂、重载运算符?
引入
矩阵
直接理解成为一个二维数组即可
矩阵乘法
1、两个矩阵A和B相乘,前提是A的列数等于B的行数。
2、设矩阵A的大小是m*n, 矩阵B的大小是n*u,那么C=A*B的大小是m*u。
矩阵乘法C=A*B的计算公式 :
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
直接优化即可
2、矩阵套矩阵
question: 给出一个n*n的矩阵A,求A^1 + A^2 + A^3 + ... + A^k。
把矩阵看作整体,当数组,构造出转移矩阵 I 0
A A
即可
矩阵与图论
结论 一个邻接矩阵A , 后,T.d[i][j] 表示点 i 到点 j 经过 n条边 (n-1个点)的路径数量
证明 : 将M=1、2、3 算过之后发现成立,感性理解写柿子就能验证正确性
板子题,因为 A[i][j]表示 i 到 j 距离,T=A^n ,T[i][j] 就是 i 到 j 经过 n 条边 最短路长度
完结撒花 ……^^^^^……