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

勒让德公式

当需要将 \(N!\) 分解为质因数的乘积时,直接计算阶乘再分解显然不现实,因为 \(N\) 稍大时结果就会巨大无比。勒让德公式提供了一种优雅的方法,可以直接计算出 \(N!\) 中每个质因子的指数,而不需要计算阶乘本身。

勒让德公式:对于任意质数 \(p\),阶乘 \(N!\) 中质因子 \(p\) 的指数 \(v_p(N!)\) 等于 \(v_p(N!) = \left\lfloor \dfrac{N}{p} \right\rfloor + \left\lfloor \dfrac{N}{p^2} \right\rfloor + \left\lfloor \dfrac{N}{p^3} \right\rfloor + \cdots = \sum \limits_{k=1}^{\infty} \left\lfloor \dfrac{N}{p^k} \right\rfloor\),这里 \(\lfloor x \rfloor\) 表示向下取整。

为什么这个公式成立?考虑从 \(1\)\(N\) 的所有整数,每个数都可能贡献若干个质因子 \(p\),逐层计算:

  • 首先,在 \(1, 2, \dots, N\) 中,能被 \(p\) 整除的数有 \(\lfloor N/p \rfloor\) 个,每个这样的数至少贡献一个 \(p\)
  • 其次,在这些数中,有些数还能被 \(p^2\) 整除,它们会额外再贡献一个 \(p\)(因为已经算过一次,所以第二次相当于补上一个 \(p\)),能被 \(p^2\) 整除的数有 \(\lfloor N/p^2 \rfloor\) 个。
  • 以此类推,能被 \(p^k\) 整除的数有 \(\lfloor N/p^k \rfloor\) 个,每个这样的数贡献了第 \(k\)\(p\)

因此,总指数就是所有 \(k\)\(\lfloor N/p^k \rfloor\) 之和。当 \(p^k \rt N\) 时,\(\lfloor N/p^k \rfloor = 0\),所以实际上只需计算到 \(p^k \le N\) 为止。

例题:P10495 阶乘分解

给定整数 \(N \ (3 \le N \le 10^6)\),要求将 \(N!\) 分解质因数,并按照算术基本定理的形式输出所有质因子 \(p_i\) 及其指数 \(c_i\)

只有 \(\le N\) 的质数才可能是 \(N!\) 的质因子,使用线性筛筛出所有可能的质因子。

对于筛出的每个质数 \(p_i\),应用勒让德公式计算其指数。

线性筛部分的时间复杂度为 \(O(N)\),而 \(N\) 以内质数个数约为 \(O(N/ \log N)\) 个,对于每个质数,只需要 \(O(\log N)\) 的时间计算,因此对整个 \(N!\) 分解质因数的时间复杂度为 \(O(N)\)

参考代码
#include <cstdio>
const int N = 1e6 + 5;
bool f[N];
int p[N], cnt;
void sieve(int n) {f[0] = f[1] = true;cnt = 0;for (int i = 2; i <= n; i++) {if (!f[i]) {p[cnt++] = i;}for (int j = 0; j < cnt && i * p[j] <= n; j++) {f[i * p[j]] = true;if (i % p[j] == 0) break;}}
}
int main()
{int n; scanf("%d", &n);sieve(n);for (int i = 0; i < cnt; i++) {int c = 0, t = p[i];// 使用循环累加每个 p^k 的倍数个数while (t <= n) {c += n / t;if (n / p[i] < t) break; // 防止溢出t *= p[i];}printf("%d %d\n", p[i], c);}return 0;
}
http://www.jsqmd.com/news/421937/

相关文章:

  • 数据同步怎么做 - 智慧园区
  • 基于flask和python框架的高校团支部团务管理系统-vue pycharm django
  • SSH 免密登录快速教程
  • 基于flask和python框架的高校教材征订管理系统的设计与实现-vue pycharm django
  • 基于flask和python框架的服装销售商城平台-vue pycharm django
  • 使用Quick3D粒子的雨效果
  • 基于flask和python框架的求职招聘网站-vue pycharm django
  • 2D渲染-介绍Qt Canvas Painter
  • 基于flask和python框架的热门车型汽车推荐网站-vue pycharm django
  • 2026年2月拱形拼装钢波纹管供货厂家,涵洞工程资质案例解析 - 品牌鉴赏师
  • 保姆级AI编程提示词教学!前端开发专属,粘贴即用高效提效
  • 2026银狐(SilverFox)病毒防护服务公司推荐排行 品质臻选榜 智能预警/全周期运维/跨国适配 - 极欧测评
  • Qt Quick认证测试已发布
  • RAG、Agent、MCP、Skill一句话讲清_AI_底层
  • KingbaseES 共享锁(SHARE)与排他锁(EXCLUSIVE)详解及测试复现
  • Redis 分布式锁:原理、实现与高并发场景下的坑
  • 新鲜出炉!2026银狐(SilverFox)病毒防护服务公司推荐排行 全周期防护/漏洞预警/多行业适配 - 极欧测评
  • 【Azure App Service】记录App Service Kudu站点的File Manger中无法查看文件列表的原因
  • 企业Agent落地避坑指南:从无效堆砌到精准实战(非常详细),收藏这一篇就够了!
  • 1654161
  • 题解:洛谷 B2149 求三角形面积
  • 2026年2月袖口式热收缩膜包装机厂家推荐,防尘防潮包装实力工厂 - 品牌鉴赏师
  • 2026年2月冷拉伸套膜机工厂推荐,无需加热节能型套膜设备 - 品牌鉴赏师
  • 2026银狐(SilverFox)病毒防护服务公司推荐排行 高口碑榜 智能监测/应急处置/全场景防护 - 极欧测评
  • 书店“书籍推荐数字海报”,自动更新每日新书。
  • 从零部署交易所核心源码:完整实操指南(附避坑手册)
  • 计算机毕业设计springboot固定线路往返公益平台 SpringBoot框架下的社区通勤拼车与共享出行服务平台 基于SpringBoot的定制化公交线路与公益合乘管理系统
  • IDEA启动SpringBoot项目时使用mvn exec:exec启动的解决办法
  • TypeScript - 类型断言 Type Assertion(通俗易懂的详细教程)
  • 政企优选!2026银狐(SilverFox)病毒防护服务公司推荐排行 重保级防护/漏洞溯源/全球化服务 - 极欧测评