数论基础——矩阵快速幂模板

1.矩阵简介:

数论基础——矩阵快速幂模板_第1张图片

2.单位矩阵:

数论基础——矩阵快速幂模板_第2张图片

3.矩阵的加减:

数论基础——矩阵快速幂模板_第3张图片

4.常数k与矩阵相乘:

数论基础——矩阵快速幂模板_第4张图片

5.矩阵与矩阵相乘:

数论基础——矩阵快速幂模板_第5张图片
矩阵乘矩阵就是要我们模拟线性代数中矩阵求矩阵的公式,新的矩阵的第一个数就等于矩阵A的第一行的每一个元素乘上矩阵B的每一列的元素相加起来得到,那么新的矩阵的第m个元素就等于矩阵A的m行的每一个元素乘以矩阵B的m列每一个元素相加即可。
Code:

struct matrix {
   int n, m;  //n表示行, m表示列
   int a[100][100];
};
// A.m == B.n A的矩阵的列要与B的矩阵的行相等才能进行乘法运算
matrix matrix_mul(matrix A, matrix B) {
    matrix C;
    C.n = A.n;
    C.m = B.m;
    for (int i = 0; i < A.n; ++i) {
        for (int j = 0; j < B.m; ++j) {
            C.a[i][j] = 0;
            for (int k = 0; k < A.m; ++k) {
                C.a[i][j] += A.a[i][k] * B.a[k][j];
            }
        }
    }
    return C;
}

6.矩阵快速幂:

矩阵运算和数值运算均满足结合律,我们可以利用二分快速幂的思想来优化,由于幂的次数很大,求解矩阵快速幂一般会伴随取模的运算。
给出模板代码,最重要的和快速幂不同的一点是我们要使用单位矩阵与原矩阵相乘返回的也就是原矩阵。

int n; // 所有矩阵都是 n * n 的矩阵
struct matrix {
   int a[100][100];
};
matrix matrix_mul(matrix A, matrix B, int mod) {
    // 2 个矩阵相乘
    matrix C;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            C.a[i][j] = 0;
            for (int k = 0; k < n; ++k) {
                C.a[i][j] = (C.a[i][j] + A.a[i][k] * B.a[k][j] % mod) % mod;
            }
        }
    }
    return C;
}
matrix unit() {
    // 返回一个单位矩阵
    matrix res;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            if (i == j) {
                res.a[i][j] = 1;
            } else {
                res.a[i][j] = 0;
            }
        }
    }
    return res;
}
matrix matrix_pow(matrix A, int n, int mod) {
    // 快速求矩阵 A 的 n 次方
    matrix res = unit(), temp = A;
    for (; n; n /= 2) {
        if (n & 1) {
            res = matrix_mul(res, temp, mod);
        }
        temp = matrix_mul(temp, temp, mod);
    }
    return res;
}

你可能感兴趣的:(蓝桥杯,alogrithm,数论)