1 条题解

  • 0
    @ 2025-10-24 10:14:44

    问题形式化

    给定 k×kk \times k 矩阵 MM,以及二进制字符串 n=(bm1bm2b0)2n = (b_{m-1} b_{m-2} \dots b_0)_2,其中 m10000m \le 10000k50k \le 50,求

    Mn(mod1000000007) M^n \pmod{1000000007}


    1. 普通快速幂公式(整数指数)

    nn 为整数,快速幂算法基于二进制分解:

    $ n = \sum_{i=0}^{m-1} b_i 2^i, \quad b_i \in \{0,1\} $

    则 $ M^n = \prod_{i=0}^{m-1} \left(M^{2^i}\right)^{b_i} $

    计算过程: $ \begin{aligned} & \text{令 } A = I,\quad B = M \\ & \text{for } i = 0 \text{ to } m-1: \\ & \quad \text{if } b_i = 1: \quad A \leftarrow A \cdot B \\ & \quad B \leftarrow B^2 \end{aligned} $ 最终 A=MnA = M^n


    2. 二进制字符串的处理

    由于 nn 以二进制字符串 s=s0s1sm1s = s_0 s_1 \dots s_{m-1} 给出(s0s_0 是最高位,sm1s_{m-1} 是最低位),两种顺序:

    方法 A:从最低位到最高位(需要先存储字符串)

    等价于 b0b_0 对应 sm1s_{m-1}bm1b_{m-1} 对应 s0s_0

    公式: $ \begin{aligned} & A \leftarrow I,\quad B \leftarrow M \\ & \text{for } j = m-1 \text{ down to } 0: \\ & \quad \text{if } s_j = '1': \quad A \leftarrow A \cdot B \\ & \quad B \leftarrow B^2 \end{aligned} $


    方法 B:从最高位到最低位(更自然)

    nn 的二进制表示为 s0s1sm1s_0 s_1 \dots s_{m-1}s0s_0 是最高位)。

    nin_i 为前 i+1i+1 位组成的数的值,即 n0=s0,ni=2ni1+si n_0 = s_0,\quad n_{i} = 2 n_{i-1} + s_i

    那么: Mni=(Mni1)2Msi M^{n_i} = (M^{n_{i-1}})^2 \cdot M^{s_i}

    算法: $ \begin{aligned} & A \leftarrow I \\ & \text{for } i = 0 \text{ to } m-1: \\ & \quad A \leftarrow A^2 \\ & \quad \text{if } s_i = '1': \quad A \leftarrow A \cdot M \end{aligned} $


    3. 正确性证明(方法 B)

    归纳法:

    • 初始:i=1i = -1n=0n = 0A=I=M0A = I = M^0
    • 假设 i1i-1A=Mni1A = M^{n_{i-1}}
    • ii 步:
      • 先平方:A(Mni1)2=M2ni1A \leftarrow (M^{n_{i-1}})^2 = M^{2 n_{i-1}}
      • si=1s_i = 1:$A \leftarrow M^{2 n_{i-1}} \cdot M = M^{2 n_{i-1} + 1} = M^{n_i}$
      • si=0s_i = 0AA 保持不变,即 M2ni1=MniM^{2 n_{i-1}} = M^{n_i}(因为 ni=2ni1n_i = 2 n_{i-1})。

    因此循环结束时 A=Mnm1=MnA = M^{n_{m-1}} = M^n


    4. 复杂度分析

    • 一次 k×kk \times k 矩阵乘法需要 O(k3)O(k^3) 次算术运算(模 109+710^9+7)。
    • 循环次数 = 二进制长度 m10000m \le 10000
    • 每次循环:1 次矩阵平方,可能加 1 次矩阵乘法。
    • 总运算量:$O(m \cdot k^3) \approx 10000 \cdot 50^3 = 1.25 \times 10^9$ 次模运算。
    • 模运算用 64 位整数可较快完成,在时限内可行。

    5. 数学视角

    这本质上是矩阵的乘法半群上的快速幂算法,不依赖数的整数表示,只依赖二进制位的顺序和矩阵的结合律。

    公式总结: $ M^n = \left( \cdots \left( \left( I^2 \cdot M^{s_0} \right)^2 \cdot M^{s_1} \right)^2 \cdots \right)^2 \cdot M^{s_{m-1}} $ 其中 MsiM^{s_i}si=1s_i=1 时为 MM,否则为 II


    这样,我们完全用数学公式和推导描述了该问题的解法,无需代码。

    • 1

    信息

    ID
    3998
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者