第十一届蓝桥杯国赛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
### 关于第十二届蓝桥杯EDA 针对参者对于获取第十二届蓝桥杯EDA设计与开发具体原的需求,在准备此类竞时,官方通常不会公开完整的历年试集。然而,可以通过一些途径间接获得练习资源和了解考试形式。 一方面,可以从往年的培训资料、模拟测试以及相关技术论坛中寻找相似类型的目进行训练[^1]。这些资源能够帮助理解事考察的知识点和技术能力范围,从而更好地为实际比做准备。 另一方面,许多高校或培训机构会基于以往的经验整理出针对性较强的备考材料,其中包括但不限于往年真解析、重点难点讲解等内容。虽然未必能找到确切的第十二届EDA,但是通过这类高质量的学习素材同样可以有效提升应试水平并熟悉可能遇到的问类型。 为了更贴近真实的考场环境,建议尽可能多地参与线上线下的模拟竞活动,以此来检验自己的学习成果并与他人交流心得体验。 ```cpp // 示例代码用于展示如何解决类似问而非提供具体某一年度的真实考 #include <iostream> using namespace std; int main() { int n; cout << "请输入一个正整数N(3<=N<=20):" ; cin >> n; long long factorialSum = 0, currentFactorial = 1; for (int i = 1; i <= n; ++i){ currentFactorial *= i; factorialSum += currentFactorial; } cout << "从1到" << n << "所有正整数阶乘之和为:" << factorialSum << endl; return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值