矩阵乘法
两矩阵相乘,左矩阵列数必须等于右矩阵行数
struct matrix
{
int n, m; // 行, 列
int c[N][N];
};
matrix mul(matrix a, matrix b, int mod)
{
matrix res;
res.n = a.n;
res.m = b.m
memeset(res, 0, sizeof res);
for(int i = 0; i < n; i++) // a的行数
for(int j = 0; j < m; j++)// b的列数
for(int k = 0; k < a.m; k++)// a的列数或b的行数(相同)
res.c[i][j] = (res.c[i][j] + a.c[i][k] * b.c[k][j] % mod) % mod;
return res;
}
矩阵快速幂
原理与快速幂相似,将乘法改为矩阵乘法即可
matrix matirx_qmi(matrix a, int k, int mod)
{
matrix res;
res.n = a.n, res.m = a.m;
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j++)
res.c[i][j] = (i == j);
while(k)
{
if(k & 1) res = mul(res, a, mod);
a = mul(a, a, mod);
k <<= 1;
}
return res;
}