当前位置: 首页 > article >正文

算法笔试-编程练习-好题-03

这是一道非常综合的质数类的题目,值得仔细理解。


题目描述

n个正整数ai,希望你求出这些数的阶乘全部乘在一起生成的大数有多少个因子

输入描述

第一行输入一个正整数n。

第二行输入n个正整数ai​,用空格隔开

1≤n≤2×10^5

1≤ai≤10^6

输出描述

一个整数,代表这个乘积的因子数量,由于答案可能过大,请对10^9+7取模.

样例

输入

3
1 2 3

输出

6

说明

1!*2!*3!=12,共有1,2,3,4,6,12六个因子。

题目分析

【题目类型:寻找素数、因数分解、动态规划】

这是质因数分解类题目比较综合的一道,我们首先来理解题意:求1!*2!*3!=12有多少个因数。每个合数都可以被描述为若干质数次方的乘积,例如:12 = 2^2*3^1,那么如何求因子数量呢?

对于2我们有3种取法,取0个,1个和2个,对于3我们有2种取法,0个和1个,因此12共有3*2个因子,也就是指数+1的累乘,也就是(2+1)*(1+1)。

有了这样的公式我们的思路就清晰了:找到最终大数的每个质因数的指数。

因为大数是通过阶乘求得的,那么必定很多数字会被乘很多次,所以直觉上我们需要先统计每个数字使用的次数,阶乘描述的是1-n的连城,也就是1-n之间所有数字的使用次数+1。对于这种对于指定区间同时+上一个数字的操作,我们可以使用【差分数组】,用O(1)的时复杂度实现。最后用O(n)的时间复杂度复原(详见代码)。

有了每个数字的使用频次,接下来我们就希望找到每个数字的质因数及其指数。逐一分解时间复杂度过高,我们可以首先计算出指定区间内全部的指数(详见代码)。

再通过遍历质数的方式统计每个数字对该质数的指数,这里可以使用动态规划进行加速,我们假设数字i是指数p的倍数,那么 power[i] = power[i//p] +1(详见代码)。

我们遍历所有数字,累加(数字使用的频次*其质因数的指数),得到的结果就可以带回最初的公式中了。

【注意】除了上述算法外,python还有一个小细节需要注意,就是 ans = ans*(cnt+1) % mod这句话,不要写成ans *= (cnt+1) % mod,这样的写法会导致ans事实上没有被取模,从而导致涉及到大数乘法,计算速度变慢。

代码:

mod = 10**9 +7

n = int(input())
arr = list(map(int, input().split()))
max_num = max(arr)

# 用【查分数组--每次更新O(1)时间复杂度】统计每个数字被乘的次数
pre = [0]*(max_num+2)
for a in arr:
    pre[1] += 1
    pre[a+1] -= 1
for i in range(1, max_num+1):
    pre[i] += pre[i-1]

# 【埃式筛选素数】
primes = [2]
is_prime = [True] * (max_num+1)
p = 3
while p <= max_num:
    if is_prime[p]:
        primes.append(p)
        for i in range(p*p, max_num+1, p):
            is_prime[i] = False
    p += 2

# 统计每个素因数次方(对于整体阶乘积),同时计算因数的数量
ans = 1
for p in primes:
    cnt = 0
    power = [0]*(max_num+1)
    for i in range(p, max_num+1, p):
        power[i] = power[i//p] + 1
        cnt += pre[i]*power[i]
    if cnt != 0:
        ans = ans*(cnt+1) % mod
print(ans % mod)


http://www.kler.cn/a/288781.html

相关文章:

  • JavaScript 观察者设计模式
  • RabbitMQ高效的消息队列中间件原理及实践
  • 优化时钟网络之时钟抖动
  • Vector 深度复制记录
  • 数据集标注txt文件读取小工具
  • 车-路-站-网”信息耦合的汽车有序充电
  • 前端框架大观:探索现代Web开发的基石
  • react- native创建pdf
  • mysql学习教程,从入门到精通,MySQL介绍(1)
  • 设计模式及创建型模式-python版
  • C++ Qt进程间通信机制之QRO、QRemoteObjectHost
  • Anaconda安装并配置Python环境 | Python系列教程
  • 把设计模式用起来!(一)——楔
  • 【日常记录-JS】HTML5中使用SVG元素
  • LeetCode40 组合总和 II
  • 安卓model转鸿蒙ets
  • Centos挂载yum源
  • Spring框架
  • 店铺所有商品接口数据解析,JSON格式的示例
  • 在Spring Boot中实现请求IP白名单拦截
  • python-读取word中的内容
  • 代码随想录第二十天 | 513. 找树左下角的值,路径总和,106. 从中序与后序遍历序列构造二叉树
  • react|useState的异步渲染
  • 【AIGC】ChatGPT 3.5/4.0 新手使用手册
  • 【pyhton】python如何实现将word等文档中的文字转换成语音
  • 如何用Python 下载B站上的视频