#lydlx03x0B13. 矩阵幂求和 Matrix Power Series

矩阵幂求和 Matrix Power Series

矩阵幂和

题目描述

给定 n×nn \times n 矩阵 AA 和正整数 kk,求和 S=A+A2+A3++AkS = A + A^2 + A^3 + \ldots + A^k

输入格式

输入只包含一个测试用例。

第一行输入包含三个正整数 n,kn, kmm

接下来 nn 行,每行包含 nn 个非负整数(均不超过 32,768),用以描绘矩阵 AA

输出格式

按与描述矩阵 AA 相同的方式,输出将 SS 中所有元素对 mm 取模后得到的矩阵。

数据范围

  • 1n301 \le n \le 30
  • 1k1091 \le k \le 10^9
  • 1m<1041 \le m < 10^4

输入样例

2 2 4
0 1
1 1

输出样例

1 2
2 3

样例解释

输入数据

  • n=2n = 2:2×2矩阵
  • k=2k = 2:求 A+A2A + A^2
  • m=4m = 4:结果对4取模

矩阵 AA

A=[0111]A = \begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix}

计算过程

计算 A2A^2

$$A^2 = A \times A = \begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix} \times \begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix} = \begin{bmatrix} 1 & 1 \\ 1 & 2 \end{bmatrix}$$

计算 S=A+A2S = A + A^2

$$S = \begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix} + \begin{bmatrix} 1 & 1 \\ 1 & 2 \end{bmatrix} = \begin{bmatrix} 1 & 2 \\ 2 & 3 \end{bmatrix}$$

m=4m=4 取模: 矩阵元素已经小于4,保持不变:

$$S \mod 4 = \begin{bmatrix} 1 & 2 \\ 2 & 3 \end{bmatrix}$$

输出:

1 2
2 3

问题分析

需要计算:

$$S = A + A^2 + A^3 + \ldots + A^k = \sum_{i=1}^{k} A^i$$

直接计算不可行

由于 kk 最大可达 10910^9,直接逐项计算矩阵幂然后求和的时间复杂度为 O(kn3)O(k \cdot n^3),显然不可行。

矩阵快速幂思想

类似快速幂,可以使用分治构造扩展矩阵的方法。

方法1:分治法(二分递归)

Sk=i=1kAiS_k = \sum_{i=1}^{k} A^i

递归公式:

  • kk 为偶数时:Sk=(I+Ak/2)Sk/2S_k = (I + A^{k/2}) \cdot S_{k/2}
  • kk 为奇数时:Sk=A+ASk1=A(I+Sk1)S_k = A + A \cdot S_{k-1} = A \cdot (I + S_{k-1})

证明: 对于偶数 kk

$$S_k = A + A^2 + \ldots + A^{k/2} + A^{k/2+1} + \ldots + A^k$$$$= (A + A^2 + \ldots + A^{k/2}) + A^{k/2} \cdot (A + A^2 + \ldots + A^{k/2})$$=(I+Ak/2)Sk/2= (I + A^{k/2}) \cdot S_{k/2}

方法2:构造扩展矩阵(更常用)

构造 2n×2n2n \times 2n 的扩展矩阵:

M=[A0II]M = \begin{bmatrix} A & 0 \\ I & I \end{bmatrix}

其中 IIn×nn \times n 单位矩阵,00n×nn \times n 零矩阵。

性质:

$$M^k = \begin{bmatrix} A^k & 0 \\ S_{k-1} & I \end{bmatrix}$$

其中 Sk1=I+A+A2++Ak1S_{k-1} = I + A + A^2 + \ldots + A^{k-1}

证明(数学归纳法):

  • k=1k=1 时:M=[A0II]M = \begin{bmatrix} A & 0 \\ I & I \end{bmatrix}S0=IS_0 = I
  • 假设 $M^k = \begin{bmatrix} A^k & 0 \\ S_{k-1} & I \end{bmatrix}$
  • 则 $M^{k+1} = M^k \cdot M = \begin{bmatrix} A^k & 0 \\ S_{k-1} & I \end{bmatrix} \cdot \begin{bmatrix} A & 0 \\ I & I \end{bmatrix} = \begin{bmatrix} A^{k+1} & 0 \\ S_{k-1}A + I & I \end{bmatrix}$
  • 而 $S_k = I + A + A^2 + \ldots + A^k = S_{k-1} \cdot A + I$

因此,我们只需要计算 Mk+1M^{k+1},然后提取右下部分的 SkS_k(注意 SkS_kMk+1M^{k+1} 的左下部分)。

算法步骤

方法2(扩展矩阵)具体步骤:

  1. 构造 2n×2n2n \times 2n 扩展矩阵 MMM=[AOII]M = \begin{bmatrix} A & O \\ I & I \end{bmatrix}
  2. 计算 Mk+1M^{k+1} 使用矩阵快速幂
  3. 提取结果:Sk=Mk+1S_k = M^{k+1} 的左下 n×nn \times n 子矩阵

矩阵快速幂

矩阵快速幂算法:

def matrix_pow(M, power, mod):
    result = 单位矩阵
    while power > 0:
        if power % 2 == 1:
            result = matrix_mul(result, M, mod)
        M = matrix_mul(M, M, mod)
        power //= 2
    return result

矩阵乘法

注意矩阵乘法的复杂度:O(n3)O(n^3),但这里的 nn 是扩展后的 2n2n,所以实际复杂度为 O((2n)3)=O(8n3)=O(n3)O((2n)^3) = O(8n^3) = O(n^3)

时间复杂度

  • 矩阵乘法:O(n3)O(n^3)
  • 快速幂:O(logk)O(\log k) 次矩阵乘法
  • 总复杂度:O(n3logk)O(n^3 \log k)

对于 n30n \le 30k109k \le 10^9,可以接受。

模运算

所有矩阵运算都需要对 mm 取模。

示例详细计算(输入样例)

构造扩展矩阵

$$A = \begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix}, \quad I = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}, \quad O = \begin{bmatrix} 0 & 0 \\ 0 & 0 \end{bmatrix}$$

扩展矩阵 MM(4×4):

$$M = \begin{bmatrix} 0 & 1 & 0 & 0 \\ 1 & 1 & 0 & 0 \\ 1 & 0 & 1 & 0 \\ 0 & 1 & 0 & 1 \end{bmatrix}$$

计算 Mk+1=M3M^{k+1} = M^{3}

k=2k=2,计算 M3M^{3}

M2M^2

$$M^2 = M \times M = \begin{bmatrix} 0 & 1 & 0 & 0 \\ 1 & 1 & 0 & 0 \\ 1 & 0 & 1 & 0 \\ 0 & 1 & 0 & 1 \end{bmatrix} \times \begin{bmatrix} 0 & 1 & 0 & 0 \\ 1 & 1 & 0 & 0 \\ 1 & 0 & 1 & 0 \\ 0 & 1 & 0 & 1 \end{bmatrix} = \begin{bmatrix} 1 & 1 & 0 & 0 \\ 1 & 2 & 0 & 0 \\ 1 & 1 & 1 & 0 \\ 1 & 2 & 0 & 1 \end{bmatrix}$$

M3=M2×MM^3 = M^2 \times M

$$M^3 = \begin{bmatrix} 1 & 1 & 0 & 0 \\ 1 & 2 & 0 & 0 \\ 1 & 1 & 1 & 0 \\ 1 & 2 & 0 & 1 \end{bmatrix} \times \begin{bmatrix} 0 & 1 & 0 & 0 \\ 1 & 1 & 0 & 0 \\ 1 & 0 & 1 & 0 \\ 0 & 1 & 0 & 1 \end{bmatrix} = \begin{bmatrix} 1 & 2 & 0 & 0 \\ 2 & 3 & 0 & 0 \\ 2 & 3 & 1 & 0 \\ 2 & 4 & 0 & 1 \end{bmatrix}$$

提取结果

M3M^3 的左下 2×2 子矩阵:

[2324]\begin{bmatrix} 2 & 3 \\ 2 & 4 \end{bmatrix}

这对应 S2=A+A2S_2 = A + A^2

$$S_2 = \begin{bmatrix} 1 & 2 \\ 2 & 3 \end{bmatrix}$$

与直接计算结果一致(注意这里提取的是 Sk1S_{k-1}?需要验证)。

修正: 实际上 Mk+1M^{k+1} 的左下部分应该是 SkS_k,但需要检查公式。

注意事项

  1. 正确构造扩展矩阵
  2. 矩阵乘法时注意取模
  3. 单位矩阵的构造
  4. 提取正确的结果子矩阵

时空限制

  • 时间限制:1秒
  • 空间限制:64MB