1 条题解

  • 0
    @ 2024-11-21 17:52:40

    可以使用矩阵快速幂加速递推,具体做法过程见 P1083 汉诺塔 Solution

    Python 代码(数据使用 C++ std 制造,不再放出)

    MOD = 998244353  # 定义模数
    
    # 定义矩阵 A
    A = [
        [1, 1, 1],
        [1, 0, 0],
        [0, 1, 0]
    ]
    
    # 定义初始向量 [F(2), F(1), F(0)] = [1, 1, 1]
    initial_vector = [1, 1, 1]
    
    def mat_mult(A, B):
        """矩阵乘法,并对每个元素进行取模"""
        # A 是 3x3 矩阵,B 是 3x1 向量
        result = [0] * 3
        for i in range(3):
            for j in range(3):
                result[i] += A[i][j] * B[j]
                result[i] %= MOD  # 每步都取模
        return result
    
    def mat_pow(A, power):
        """矩阵快速幂,并对每个元素进行取模"""
        # 初始化单位矩阵
        result = [[1 if i == j else 0 for j in range(3)] for i in range(3)]
        base = A
    
        while power:
            if power % 2 == 1:
                result = mat_mult_matrix(result, base)
            base = mat_mult_matrix(base, base)
            power //= 2
    
        return result
    
    def mat_mult_matrix(A, B):
        """矩阵乘法,返回 A * B,并对每个元素进行取模"""
        result = [[0] * 3 for _ in range(3)]
        for i in range(3):
            for j in range(3):
                for k in range(3):
                    result[i][j] += A[i][k] * B[k][j]
                    result[i][j] %= MOD
        return result
    
    def calculate_F(n):
        if n == 0:
            return 0
        elif n == 1 or n == 2 or n == 3:
            return 1
        
        # 使用矩阵快速幂来计算 A^(n-3)
        A_n_minus_2 = mat_pow(A, n - 3)
    
        # 计算 F(n) = A^(n-3) * [F(3), F(2), F(1)]^T
        result_vector = mat_mult(A_n_minus_2, initial_vector)
        
        # 返回 F(n)
        return result_vector[0]
    
    # 输入n并输出F(n)
    n = int(input())
    print(calculate_F(n))
    
    
  • 1

信息

ID
1088
难度
9
分类
(无)
标签
(无)
递交数
5
已通过
1
通过率
20%
上传者