题目
【题目描述】
定义阶乘 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