
阶乘分解 (算法竞赛进阶指南 P136,质因数分解)
发布日期:2021-05-04 06:49:46
浏览次数:13
分类:技术文章
本文共 1213 字,大约阅读时间需要 4 分钟。
一.题目链接:
二.题目大意:
给一个整数 N (N ≤ 1e6)
求 N!的质因数及其个数.
三.分析:
直接暴力是 O(N sqrt(N)),肯定不行.
不过可以先把 N 以内的质因数打表,再统计 1 ~ N 中每个质数出现的个数.
对于当前质数 prime[i] 来说
1 ~ N 中共出现了 N/prime[i] 次 prime[i]的倍数.
1 ~ N 中共出现了 N/prime[i]/prime[i] 次 prime[i] * prime[i] 的倍数.
...
这样便可在 O(N + logN * logN) 完成.
四.代码实现:
#includeusing namespace std;typedef long long ll;const int M = (int)1e6;const int inf = 0x3f3f3f3f;int tot;int prime[M + 5];bool is_prime[M + 5];map mp;void get_prime(){ memset(is_prime, 1, sizeof(is_prime)); is_prime[0] = is_prime[1] = 0; for(int i = 2; i <= M; ++i) { if(is_prime[i]) prime[++tot] = i; for(int j = 1; j <= tot && i * prime[j] <= M; ++j) { is_prime[i * prime[j]] = 0; if(i % prime[j] == 0) break; } }}int main(){ get_prime(); int n; scanf("%d", &n); for(int i = 1; i <= tot && prime[i] <= n; ++i) { int cnt = 0; ll num = prime[i]; while(num <= n) { cnt += n / num; num *= prime[i]; } mp[prime[i]] = cnt; } for(auto iter = mp.begin(); iter != mp.end(); ++iter) printf("%d %d\n", iter->first, iter->second); return 0;}
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年03月08日 05时14分09秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
为什么Android要采用Binder作为IPC机制?成功入职阿里
2019-03-03
大牛手把手带你!Flutter尽然还能有这种操作!面试建议
2019-03-03
如何成为一个更好的Android开发者?写给正在求职的安卓开发
2019-03-03
小白看完都会了!阿里云大师深入拆解Java虚拟机,看完这一篇你就懂了
2019-03-03
【IT之路】MySQL基础-MySQL常见操作
2019-03-03
【IT之路】Docker系列-CentOS Docker 安装
2019-03-03
【IT之路】FAQ-Hibernate报错:表不存在
2019-03-03
MySQL性能优化说明
2019-03-03
随笔一
2019-03-03
DataWay四种请求类型传参说明及缓存问题
2019-03-03
【2020阿里云博客部署实战】如何远程连接和管理控制台基本介绍
2019-03-03
【2020阿里云部署实战】使用Nginx/Caddy反向代理进行域名访问
2019-03-03
Python:入门小笔记
2019-03-03
Python:变量
2019-03-03
Java:class4 类和对象
2019-03-03
Java:class5 类的重载,final,static
2019-03-03
解决笔记本无法连接到此网络问题(Win10)
2019-03-03
Java高级之String的常用方法
2019-03-03
单链表的练习
2019-03-03
Linux中的C语言程序编译过程
2019-03-03