第十一届蓝桥杯国赛C题阶乘约数

题目

在这里插入图片描述

【题目描述】

定义阶乘 n! = 1 × 2 × 3 × · · · × n。
请问 100! (100 的阶乘)有多少个约数。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

题解

答案: 39001250856960000

碎碎念

我这题比赛的时候没做出来,甚至比赛结束也不会。这是为什么呢?因为我不知道,这题要用质因数分解来做!!!!

题解

'''
(因数和约数是一个东西,我好想写的有点乱,都有用到,大家知道就行了。)

首先讲一下思路啊,就是一个数的约数,就是他的不同质因数的个数 + 1 再连乘的结果数。

比如 4!, 也就是 24: 他质因数分解是 2 * 2 * 2 * 3 

有3个2和1个3,按照我们的说法,他的约数个数就是 (3 + 1) * (1 + 1) = 4 * 2 = 8

事实正是如此,24 的约数有 1, 2, 3, 4, 6, 8, 12, 24 一共 8 个。

为什么呢?

首先,一个大于 1 的数不管是质数还是合数一定可以由一个或多个质数乘得。
2: 2;   3: 3;   4: 2 2;   5: 5;   6: 2 3;   7: 7;   8: 2 2 2;   9: 3 3

也就代表这多个质数的乘积就是他本身,也就是他自己最大的约数。

而这些质数中多一个少一个,显然他们的乘积还是他的约数。

比如2 * 2 * 2 * 3 = 24 是 24 的约数,2 * 2 * 2 = 8 也是 24 的约数, 2 * 3 = 6 
也是 24 的约数,2 * 2 * 3 = 12 也是 24 的约数。

所以只要将他们每个质数有或没有的所有可能都遍历出来,就是约数的个数了。

而这个的个数是可以用乘法算出来的。(数学里怎么称呼这个我也不知道23333)

下面的算式中用[]代表连乘中此数可能出现次数

24 = 2 * 2 * 2 * 3 : 2[0-3] 3[0-1]

意思就是组成一个乘法,他最少有 0 个 2, 最多有 3 个 2, 最少 0 个 3, 最多 1 个 3。
乘法的结果就是24的所有约数。

而这个乘法一共会有 4 * 2 种可能。(或者想象成一个2位数,第一位可能是0,1,2,3四种可能,
第二位可能是0,1两种可能,问一共有几种组合?答案就是00,01,10,11,20,21,30,31这8种,也就是4*2?)

所以数学这个叫啥来着啊,忘记了,排列组合吗?还是什么。(啊,我好菜。)

'''
n = 100
# 因为数不大,就用最普通的方法统计质数了。
p = [2]
for i in range(3, n + 1):
    j = 2
    while j < i:
        if i % j == 0: break
        j += 1
    else: p.append(i)
print(p) # 2 3 5 7 ... 97
m = {}
for i in p: m[i] = 1 # 每个质数初始为 1,代表不选这个质数的可能。
for i in range(2, n + 1): # 遍历 [2, 100]
    x = i
    for j in p: # 遍历质数,将每个被乘数都质因数分解一下。
    # (比如 6 分解成 2*3 ,12 分解成 2*2*3)
        if j > x: break
        while x % j == 0:
            x //= j
            # 让对应的质数个数 + 1
            m[j] += 1
s = 1
# 所有质因子的个数相乘,就是约数个数了。
for i in m.values():
    s *= i
print(s) # 39001250856960000
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值