矩阵乘法
用于优化递推DP,或一些图上问题
封装一个矩阵,带乘法,加法和清空
struct matrix
{
int n,m;
long long a[N][N];
friend matrix operator * (matrix x,matrix y)
{
matrix c;
c.n=x.n;c.m=y.m;
c.clear(0);
for(int i=1;i<=c.n;++i)
{
for(int j=1;j<=x.m;++j)
{
if(x.a[i][j])
for(int k=1;k<=c.m;++k)
{
if(y.a[j][k])
c.a[i][k]=(c.a[i][k]+1ll*x.a[i][j]*y.a[j][k]%YA)%YA;
}
}
}
return c;
}
friend matrix operator + (matrix x,matrix y)
{
matrix c;
c.n=x.n;c.m=y.m;
c.clear(0);
for(int i=1;i<=c.n;++i)
{
for(int j=1;j<=c.m;++j)
{
c.a[i][j]=(c.a[i][j]+(x.a[i][j]+y.a[i][j])%YA)%YA;
}
}
return c;
}
inline void clear(bool f)
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
a[i][j]=0;
if(i==j&&f) a[i][j]=1;
}
}
return;
}
};
对于邻接矩阵
记矩阵A为一个边权均为1的一张图的邻接矩阵, 那么${A^n_{i,j}}$表示图中i点到j点距离为n的路径条数