矩阵

矩阵的定义

这个毕竟在初赛是不会考的,所以这个定义就省了,通俗的来说就是一些数字组成一个矩阵,比如\(\begin{bmatrix}1&1&1\\2&1&0\end{bmatrix}\)这种。

矩阵的运算

加法

矩阵的加法是有前提条件的,就是两个矩阵的长和宽都得一样。

比如:\(\begin{bmatrix}1&2&3\\4&5&6\end{bmatrix}\)\(\begin{bmatrix}7&8&9\\10&11&12\end{bmatrix}\)这两个矩阵,就可以做加法。

矩阵的加法是这样做的:

\(c[i][j]=a[i][j]+b[i][j]\)

\(\begin{bmatrix}a_1&b_1&c_1\\d_1&e_1&f_1\end{bmatrix} + \begin{bmatrix}a_2&b_2&c_2\\d_2&e_2&f_2\end{bmatrix} = \begin{bmatrix}a_1 + a_2&b_1 + b_2&c_1 + c_2\\d_1 + d_2&e_1 + e_2&f_1 + f_2\end{bmatrix}\)

code:

for(int i = 1; i <= n; i++)
    for(int j = 1; j <= m; j++)
        c[i][j] = a[i][j] + b[i][j];

减法

减法和加法差不多,前提条件都是一样的。

\(\begin{bmatrix}a_1&b_1&c_1\\d_1&e_1&f_1\end{bmatrix} - \begin{bmatrix}a_2&b_2&c_2\\d_2&e_2&f_2\end{bmatrix} = \begin{bmatrix}a_1 - a_2&b_1 - b_2&c_1 - c_2\\d_1 - d_2&e_1 - e_2&f_1 - f_2\end{bmatrix}\)
code:

for(int i = 1; i <= n; i++)
    for(int j = 1; j <= m; j++)
        c[i][j] = a[i][j] - b[i][j];

乘法

矩阵的乘法是矩阵需要掌握的最重要的知识之一,我们需要仔细的研究它。

先说前提条件,矩阵乘法的前提条件有一点***钻,他需要一个\(n \times m\) 的矩阵和一个 \(m \times w\)的矩阵才能相乘,也就是说至少有一条边相等的两个矩阵才能相乘。

再说矩阵乘法是怎么做的:

\(c[i][j] = \sum_{k = 1}^{k \le n} a[i][k] \times b[k][j]\)

\(\begin{bmatrix}1&2&3\\4&5&6\end{bmatrix} \times \begin{bmatrix}7&8\\9&10\\11&12\end{bmatrix} = \begin{bmatrix}1 \times 7 + 2 \times 9 + 3 \times 11 = 58 & 略\\略&略\end{bmatrix}\)

嗯,看起来有点复杂,我们来看看代码:

for(int i = 1; i <= n; i++)
    for(int j = 1; j <= m; j++)
        for(int k = 1; k <= w; k++)
            c[i][j] += a[i][k] * b[k][j];

欸?好像并不是很复杂欸。

快速幂

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Warning//////Warning//////Warning
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

压轴戏来了!矩阵快速幂才是矩阵最重要的运算!

矩阵快速幂一般用在优化dp、递推等算法的时间复杂度,一般用在数据极大的毒瘤题目。

详情

嗯,就这些。

普通的快速幂,用重载运算符重载*%就行了。

matrix operator *(const matrix& t)
{
    matrix c;
    c.init();
    c.n = n;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            for(int k = 1; k <= n; k++)
                c.mat[i][j] += mat[i][k] * t.mat[k][j];
    return c;
}
matrix operator %(const int &p)
{
    matrix c;
    c.init();
    c.n = n;
    for(int a = 1; a <= n; a++)
        for(int b = 1; b <= n; b++)
            c.mat[a][b] = mat[a][b] % p;
    return c;
}


void qpow(int b)
{
    matrix a = mat;
    matrix res = mat;
    while(b)
    {
        if(b & 1)
            res = (res * a) % p;
        a = (a * a) % p;
        b >>= 1;
    }
    mat = res;
    return;
}

\(The End\)

posted @ 2021-07-15 18:59  Akafuyu  阅读(444)  评论(0)    收藏  举报