1 条题解
-
0
问题形式化
给定 矩阵 ,以及二进制字符串 ,其中 ,,求
1. 普通快速幂公式(整数指数)
若 为整数,快速幂算法基于二进制分解:
$ 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} $ 最终 。
2. 二进制字符串的处理
由于 以二进制字符串 给出( 是最高位, 是最低位),两种顺序:
方法 A:从最低位到最高位(需要先存储字符串)
等价于 对应 , 对应 。
公式: $ \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:从最高位到最低位(更自然)
设 的二进制表示为 ( 是最高位)。
令 为前 位组成的数的值,即
那么:
算法: $ \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)
归纳法:
- 初始: 时 ,。
- 假设 时 。
- 第 步:
- 先平方:
- 若 :$A \leftarrow M^{2 n_{i-1}} \cdot M = M^{2 n_{i-1} + 1} = M^{n_i}$
- 若 : 保持不变,即 (因为 )。
因此循环结束时 。
4. 复杂度分析
- 一次 矩阵乘法需要 次算术运算(模 )。
- 循环次数 = 二进制长度 。
- 每次循环: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}} $ 其中 在 时为 ,否则为 。
这样,我们完全用数学公式和推导描述了该问题的解法,无需代码。
- 1
信息
- ID
- 3998
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者