【蓝桥杯】 阶乘约数:定义n的阶乘= 1 × 2 × 3 × · · · × n。 请问100 的阶乘有多少个约数。

【蓝桥杯】 阶乘约数

题目描述

题目传送门 >> 阶乘约数

【问题描述】
定义阶乘 n! = 1 × 2 × 3 × · · · × n。
请问 100! (100 的阶乘)有多少个约数。
【运行限制】
• 最大运行时间:1s
• 最大运行内存: 128M


答案:39001250856960000


解题思路

【补充知识】
约数个数:
任意一个大于 1 的正整数 n 可以分解质因数: n = p 1 α 1 × p 2 α 2 × … × p k α k n = p_1^{α_1} \times p_2^{α_2} \times…\times p_k^{α_k} n=p1α1×p2α2××pkαk
则n的约数的个数: ( a 1 + 1 ) ( a 2 + 1 ) ( a 3 + 1 ) … ( a k + 1 ) (a_1+1)(a_2+1)(a_3+1)…(a_k+1) (a1+1)(a2+1)(a3+1)(ak+1)
定理简证:百度百科——约数个数定理

埃拉托色尼筛选法:
在自然数列中,寻找一定范围内质数的方法。先把1删除(1既不是质数也不是合数),然后不断地读取队列中当前未读的最小数n,然后把n的倍数删去,直到需求的范围内所有的数均删除或读取。
参考:百度百科——埃拉托色尼筛选法

【总体思路】
100! 是个158位的数,用暴力求出100!的约束不太科学。但我们可以先将1~100分别做因数分解,这些因数累乘起来,得到100!的因数分解。

2 = 2 1 2 = 2^1 2=21

44 = 2 2 × 11 44 = 2^2 \times 11 44=22×11

100 = 2 2 × 5 2 100 = 2^2 \times 5^2 100=22×52


⇔ \Leftrightarrow 100 ! = 2 1 × . . . × 2 2 × 11 × . . . × 2 2 × 5 2 100! = 2^1\times...\times2^2 \times 11 \times...\times 2^2 \times 5^2 100!=21×...×22×11×...×22×52

整合成以下格式: p 1 α 1 × p 2 α 2 × … × p k α k p_1^{α_1} \times p_2^{α_2} \times…\times p_k^{α_k} p1α1×p2α2××pkαk
则约数总数: ( a 1 + 1 ) ( a 2 + 1 ) ( a 3 + 1 ) … ( a k + 1 ) (a_1+1)(a_2+1)(a_3+1)…(a_k+1) (a1+1)(a2+1)(a3+1)(ak+1)

【代码思路】
1、对于 n u m = p 1 α 1 × p 2 α 2 × … × p k α k num = p_1^{α_1} \times p_2^{α_2} \times…\times p_k^{α_k} num=p1α1×p2α2××pkαk ,将 p i p_i pi a i a_i ai 用数组arr存储,即arr[ p i p_i pi ] = a i a_i ai
2、由于结果会是一个比较大的数,那么res的数值范围必须足够大,所以这里将res的数值类型定义为 ‘long long’ 。


解题代码

C语言

#include <stdio.h>

int main(){
	int arr[101] = {0};
	int i, p, k;
	long long res = 1;

	// num=p1^a1*p2^a2*...*pn^an
	// arr[pi]=ai,num能被pi除ai次
	for(i=2; i<=100; i++){	
		int num = i;
		for(p=2; p*p<=i; p++){	//将num因式分解
			while(num%p==0){
				++arr[p];
				num /= p;
			}
		}
		++arr[num];
	}

	//约数总数res=(a1+1)(a2+1)...(an+1)
	for(k=2; k<=100; k++){	
		res *= arr[k] + 1;
	}
	printf("%lld",res);
	return 0;
}
  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,可以将 $100!$ 分解质因数。由于 $100!$ 中包含了大量的质因子,因此需要先确定其中每个质因子的指数。 首先考虑质数 $2$。$100!$ 中有 $50$ 个数是偶数,其中有 $25$ 个是 $4$ 的倍数,$12$ 个是 $8$ 的倍数,$6$ 个是 $16$ 的倍数,$3$ 个是 $32$ 的倍数,$1$ 个是 $64$ 的倍数。因此,$2$ 在 $100!$ 的质因数分解中的指数为: $$ \left\lfloor\frac{100}{2}\right\rfloor + \left\lfloor\frac{100}{4}\right\rfloor + \left\lfloor\frac{100}{8}\right\rfloor + \left\lfloor\frac{100}{16}\right\rfloor + \left\lfloor\frac{100}{32}\right\rfloor + \left\lfloor\frac{100}{64}\right\rfloor = 97 $$ 同理,考虑质数 $3$。$100!$ 中有 $33$ 个数是 $3$ 的倍数,其中有 $11$ 个是 $9$ 的倍数,$3$ 个是 $27$ 的倍数。因此,$3$ 在 $100!$ 的质因数分解中的指数为: $$ \left\lfloor\frac{100}{3}\right\rfloor + \left\lfloor\frac{100}{9}\right\rfloor + \left\lfloor\frac{100}{27}\right\rfloor = 48 $$ 同理,考虑其他质数,最终可以得到 $100!$ 的质因数分解式: $$ 100! = 2^{97} \times 3^{48} \times 5^{24} \times 7^{16} \times 11^{9} \times 13^{7} \times 17^{5} \times 19^{5} \times 23^{4} \times 29^{3} \times 31^{3} \times 37^{2} \times 41^{2} \times 43^{2} \times 47^{2} \times 53 \times 59 \times 61 \times 67 \times 71 \times 73 \times 79 \times 83 \times 89 \times 97 $$ 一个正约数可以表示为 $2^a \times 3^b \times 5^c \times 7^d \times 11^e \times \cdots$ 的形式,其中指数 $a,b,c,d,e,\cdots$ 均为非负整数且小于等于对应质因子在 $100!$ 中的指数。因此,一个正约数的个数可以表示为: $$(97+1) \times (48+1) \times (24+1) \times (16+1) \times (9+1) \times (7+1) \times (5+1) \times (5+1) \times (4+1) \times (3+1) \times (3+1) \times (2+1) \times (2+1) \times (2+1) \times (2+1) \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 \times 2 = 64809076808000$$ 因此,$100!$ 有 $64809076808000$ 个正约数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值