• 求第n项的因子数量


    最近笔试期间遇到一个难题,现在终于解决了,感谢各路大佬的指点,我在这里分享一下结果。

    小红拿到一个数列满足:

    f(1) = a;      f(2) = b;      f(i) = f(i-1) * f(i-2) * c^d

    题目要求计算出第n项的因子数量,因子数量对 10^9+1 取模。

    输入:a, b, c, d, n 5个整数, (1 <= a, b, c, d, n <= 10^12)

    例如:输入:1 2 3 4 3

               输出:10

    解题理论准备:快速幂矩阵、因子与质因子关系

    1、因子与质因子的关系-CSDN博客

     2、快速幂算法-python-CSDN博客

    3、算法学习笔记(4):快速幂 - 知乎 

    python代码如下:

    1. '''
    2. 解题思路:
    3. 1、分别算出 a, b, c三个数的质因数;
    4. 2、通过快速幂矩阵计算出第n项数据中a、b、c的指数(计算过程中要取模);
    5. 3、结合a、b、c的指数,以及a, b, c三个数的质因数,
    6. 来求出第n项数据对应的质因数,以及对应质因数的指数;
    7. 4、最后将第n项数据的各个质因数的指数分别+1之后相乘,就得到第n项数据的因子个数。
    8. '''
    9. import time
    10. import numpy as np
    11. def add2dict(dic, n):
    12. if n in dic:
    13. dic[n] += 1
    14. else:
    15. dic[n] = 1
    16. return dic
    17. def primeFactors(num):
    18. factors = {}
    19. i = 2
    20. while i * i <= num:
    21. if num % i == 0:
    22. num //= i
    23. factors = add2dict(factors, i)
    24. else:
    25. i += 1
    26. if num > 1:
    27. factors = add2dict(factors, num)
    28. return factors
    29. # 快速幂矩阵
    30. def matrixFastPower(matrix, power, num_mod):
    31. matrix = np.array(matrix) % num_mod
    32. res = np.eye(matrix.shape[0])
    33. while power:
    34. if power & 1:
    35. res = np.dot(res, matrix) % num_mod
    36. power >>= 1
    37. matrix = np.dot(matrix, matrix) % num_mod
    38. return res
    39. if __name__ == '__main__':
    40. start_time = time.time()
    41. a, b, c, d, n = int(1e12), int(1e12), int(1e12), int(1e12), int(1e12)
    42. # a, b, c, d, n = 1, 2, 3, 4, 6
    43. num_mod = int(10e9 + 7)
    44. if n == 1:
    45. factors_a = primeFactors(a, num_mod)
    46. sum = 1
    47. for i in factors_a:
    48. sum *= (factors_a[i] + 1) % num_mod
    49. elif n == 2:
    50. factors_b = primeFactors(b)
    51. sum = 1
    52. for i in factors_b:
    53. sum *= (factors_b[i] + 1) % num_mod
    54. else:
    55. factors_a = primeFactors(a)
    56. factors_b = primeFactors(b)
    57. factors_c = primeFactors(c)
    58. A = [[0, 1],
    59. [1, 1]]
    60. C = [[0, 1, 0],
    61. [1, 1, 1],
    62. [0, 0, 1]]
    63. A_n = matrixFastPower(A, n - 1, num_mod)
    64. C_n = matrixFastPower(C, n - 1, num_mod)
    65. # a_pow = A^(n-1) * [a(1), a(2)]
    66. a_pow = int(np.dot(A_n, np.array([1, 0]).T)[0]) % num_mod
    67. # b_pow = A^(n-1) * [b(1), b(2)]
    68. b_pow = int(np.dot(A_n, np.array([0, 1]).T)[0]) % num_mod
    69. # c_pow = C^(n-1) * [c(1), c(2), d]
    70. c_pow = int(np.dot(C_n, np.array([0, 0, d]).T)[0]) % num_mod
    71. # print(a_pow, b_pow, c_pow)
    72. for i in factors_a:
    73. factors_a[i] = ((factors_a[i] % num_mod) * a_pow) % num_mod
    74. for j in factors_b:
    75. factors_b[j] = ((factors_b[j] % num_mod) * b_pow) % num_mod
    76. if j not in factors_a:
    77. factors_a[j] = factors_b[j] % num_mod
    78. else:
    79. factors_a[j] = (factors_a[j] + factors_b[j]) % num_mod
    80. del factors_b
    81. for k in factors_c:
    82. factors_c[k] = ((factors_c[k] % num_mod) * c_pow) % num_mod
    83. if k not in factors_a:
    84. factors_a[k] = factors_c[k] % num_mod
    85. else:
    86. factors_a[k] = (factors_a[k] + factors_c[k]) % num_mod
    87. del factors_c
    88. sum = 1
    89. for ix in factors_a:
    90. sum *= (factors_a[ix] + 1) % num_mod
    91. sum %= num_mod
    92. print(sum)
    93. print("Time:", round((time.time() - start_time) * 1000, 2), 'ms')

  • 相关阅读:
    很详细的Django开发入门详解(图文并茂)
    16K 16BIT双声道文件格式解析
    JAVA系列 面向对象编程?子类到底能继承父类的那些东西?如何继承?static方法能被继承吗?构造函数能被继承吗?继承中常见误区总结。
    Word标题编号转换为纯文本
    JavaWeb(十一) AJAX + json
    OpenLDAP基本概念、部署讲解以及和zabbix的对接实验(基于OpenEuler和CentOS-Stream 9)
    Vue将Element Plus 进行自定义封装
    centos设置允许访问的ip
    OGNL表达式注入分析
    手写简易Spring框架
  • 原文地址:https://blog.csdn.net/m0_37738114/article/details/133418548