如何计算算法超大规模输入下的输出?以递推谜题为例
面试谜题:求解超大输入下的递推序列结果
问题背景
面试时遇到如下问题:给定下面的谜题函数,求puzzle(power(2022, 100))的输出?
原函数代码:
function puzzle(N) { A, B, C, D = 1, 1, 1, 1 .repeat N times { X = D + 2 * C + 3 * B + 4 * A a, b, c, d = b, c, d, x } return D % 10000000000 }
我实现函数后发现,这是类似斐波那契数列的递推序列,但输入2022^100是天文数字,直接循环根本无法完成计算。当时我提出可以重构为类斐波那契的求和形式优化,面试官认可思路方向,但我没能写出具体实现。现在整理出完整解法和思路解析。
核心思路解析
这个问题的关键是将递推关系转化为矩阵乘法,再用快速幂算法处理超大指数,结合模运算避免数值溢出:
递推关系矩阵建模
原函数的每轮迭代逻辑可转化为矩阵运算:- 新A = 旧B
- 新B = 旧C
- 新C = 旧D
- 新D = 4旧A + 3旧B + 2旧C + 1旧D
写成矩阵形式为:
[新A] [0 1 0 0] [旧A] [新B] = [0 0 1 0] [旧B] [新C] [0 0 0 1] [旧C] [新D] [4 3 2 1] [旧D]记该4×4矩阵为M,初始向量为
[A0, B0, C0, D0] = [1,1,1,1],则N次迭代后的向量为M^N × [1,1,1,1]^T,取第4个元素就是最终的D值,再对10^10取模即可。快速幂优化计算
直接计算M^N需要O(N)时间,完全无法处理2022^100这样的超大指数。快速幂算法通过将指数拆分为二进制,不断对矩阵平方并按需相乘,把时间复杂度降到O(logN),同时每一步都做模运算,避免数值溢出。模运算的必要性
题目要求返回D % 10000000000,根据模运算性质(a*b) mod m = [(a mod m)*(b mod m)] mod m,我们可以在矩阵乘法的每一步对结果取模,保证所有中间值都不会超过10^10,避免数值溢出问题。
Python实现代码
# 用Python重写,Ruby处理矩阵太麻烦 def matrix_pow(matrix, power, modulus): # 初始化结果为同尺寸的单位矩阵 result = [[int(i == j) for j in range(len(matrix))] for i in range(len(matrix))] while power > 0: # 如果指数当前位为1,将结果与矩阵相乘 if power % 2 == 1: result = matrix_multiply(result, matrix, modulus) # 矩阵平方,指数除以2 matrix = matrix_multiply(matrix, matrix, modulus) power //= 2 return result # 矩阵乘法,带模运算 def matrix_multiply(matrix1, matrix2, modulus): # 初始化结果矩阵为全0 result = [[0] * len(matrix2[0]) for _ in range(len(matrix1))] # 执行矩阵乘法 for i in range(len(matrix1)): for j in range(len(matrix2[0])): for k in range(len(matrix2)): result[i][j] += matrix1[i][k] * matrix2[k][j] result[i][j] %= modulus return result # 求解谜题的核心函数 def puzzle(n): # 定义递推对应的转换矩阵M M = [[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1], [4, 3, 2, 1]] # 计算M的n次幂,模10^10 M_pow = matrix_pow(M, n, 10**10) # 初始向量 v = [1, 1, 1, 1] # 矩阵乘向量得到结果 result = matrix_multiply(M_pow, [[x] for x in v], 10**10) # 返回第4行第1列的元素,对应最终的D值模10^10 return result[3][0] print(puzzle(10)) # 输出 30520 print(puzzle(100)) # 输出 720820623 print(puzzle(2022**100)) # 输出 2436815984
内容的提问来源于stack exchange,提问作者Lautaro Graciani
相关产品推荐
相关产品推荐

