矩阵
本蒟蒻刚刚学习矩阵,还很辣鸡。。
矩阵,顾名思义,就是由数字组成的矩形
通常用Anm表示一个有n列m行的矩阵,其中aij表示第i列第j行的元素,又称元
例如:
1 2
3 5
就是一个2*2的矩阵【不会放数学公式所以括号就不画了= =】
矩阵加法
两个矩阵相加,首先必须是两个行列n*m都相同的矩阵
相加就是把相同位置的数加起来得到一个新的n*m的矩阵
矩阵减法
类似于矩阵加法,相同位置相减
矩阵数乘
表示为a*A,也就是用一个数去乘一个矩阵
得到一个相同大小的矩阵,每个位置上的数字扩大a倍
矩阵乘法
以上三种运算都十分直观而好理解
但矩阵乘法就很迷了【本蒟蒻表示好难QAQ】
前提:
如果两个矩阵A,B能相乘,必须满足 A的列数=B的行数
比如:
1 2 3 5 8
4 5 6 3 4
2 6
这两个矩阵就可以相乘
怎么乘呢?
对于上边两个矩阵,相乘结果为:
(1*5+2*3+3*2) (1*8+2*4+3*6)
(4*5+5*3+6*2) (4*8+5*4+6*6)
看出来了吗?
得到的新矩阵的第一列第一个数,为A矩阵的第一行所有数与B矩阵第一列数每个数对应相乘后相加的结果,
同理,第一列第二个数,等于A矩阵第一行与B矩阵第二列进行同样的操作
也就是说,对于第i列第j个数,等于A矩阵第i行与B矩阵第j列进行一次对应相乘相加
矩阵乘法的意义大概就是两组数之间的映射运算关系
比如方程5x+3y=1
可以写成:
5 3 x = 1
y
【没有扩号看着好难看= =】
为了方便,通常把矩阵写成进结构体,然后重载运算符
struct Matrix{
LL s[maxn][maxn],n,m;
Matrix() {n=m=0;fill(s[0],s[0]+maxn*maxn,0);}
};
inline Matrix operator *(const Matrix& a,const Matrix& b){
Matrix c;
if(a.m!=b.n) return c;
c.n=a.n;c.m=b.m;
for(int i=1;i<=c.n;i++)
for(int j=1;j<=c.m;j++)
for(int k=1;k<=a.m;k++)
c.s[i][j]=(c.s[i][j]+a.s[i][k]*b.s[k][j]%P)%P;
return c;
}
矩阵快速幂
矩阵乘法没有交换律,但满足结合率,所以在对数的快速幂仍然可以运用到矩阵中来
但矩阵能自乘必须满足自身是方阵(n==m)
Matrix qpow(Matrix a,LL b){
Matrix ans;
ans.n=ans.m=a.n;
for(int i=1;i<=a.n;i++)
for(int j=1;j<=a.m;j++)
ans.s[i][j]=(i==j);
for(;b;b>>=1,a=a*a)
if(b&1) ans=ans*a;
return ans;
}
我那么弱,没看懂还是看其他dalao的吧QAQ