CH 3101 - 阶乘分解 - [埃筛]
2024-10-02 10:11:33
题目链接:传送门
题解:
$(1e6)!$ 这种数字,表示都表示不出来,想直接 $O(\sqrt{N})$ 分解质因数这种事情就不要想了。
考虑 $N!$ 的特殊性,这个数字的所有可能包含的质因子,就是 $1 \sim N$ 这些数所包含的质因子。因此,只需要考虑 $1 \sim N$ 这每个数字的质因子即可。
那么,不妨筛出属于 $1 \sim N$ 范围内的所有质数,对于每一个质数 $p$,$1 \sim N$ 中显然有 $\lfloor N/p \rfloor$ 个能够被 $p$ 整除的数字,也就是说 $N!$ 的质因子中,可以确定至少有这么 $\lfloor N/p \rfloor$ 个 $p$。换句话说,产生了 $\lfloor N/p \rfloor$ 的贡献。
然后,我们进一步考虑,$\lfloor N/p \rfloor$ 个能够被 $p$ 整除的数字中,显然还有 $\lfloor N/{p^2} \rfloor$ 个能够被 $p^2$ 整除的数字,这些数字产生进一步产生贡献 $\lfloor N/{p^2} \rfloor$,往后依次类推 $\lfloor N/{p^3} \rfloor, \lfloor N/{p^4} \rfloor, \cdots$。
AC代码:
#include<bits/stdc++.h>
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
int n; const int MAX=1e6;
bool noprm[MAX+];
vector<int> prm;
void Erato(int n)
{
noprm[]=noprm[]=;
for(int i=;i<=n;i++)
{
if(noprm[i]) continue;
prm.pb(i);
for(int j=i;j<=n/i;j++) noprm[i*j]=;
}
} int main()
{
ios::sync_with_stdio();
cin.tie(), cout.tie(); cin>>n;
Erato(n);
for(auto p:prm)
{
ll cnt=;
for(ll x=p;x<=n;x*=p) cnt+=n/x;
if(cnt>) cout<<p<<' '<<cnt<<'\n';
}
}
最新文章
- Spark运行模式与Standalone模式部署
- centos mysql php Curl
- MySQL性能优化的最佳21条经验
- mybatis配置优化
- [RabbitMQ] AMQP close-reason, initiated by Library, code=541
- Java、fileless恶意软件威胁桌面安全
- MFC程序中消息以及函数的处理顺序简介[转]
- 转载RabbitMQ入门(1)--介绍
- Oracle创建触发器实现主键自增
- git命令(流程)
- *[codility]Number-of-disc-intersections
- Unity重要的函数
- Sublime Text 3 使用MarkDown编写带预览的文本
- Ubuntu 14 安装WPS
- CTypes
- 关于Tcpdump抓包总结
- axure交互样式(下拉列表和矩形)
- 全文检索Solr集成HanLP中文分词
- JAVA课堂动手动脑实验--方法的重载定义,组合数的递归算法
- url下载文件到本地
热门文章
- MySQL 的 autocommit
- MinFilter(MaxFilter)快速算法C++实现
- 怎么样加快JavaScript加载和执行效率
- webstorm11.0下载地址和webstorm11.0破解程序patcher.exe下载使用方法说明 前端IDE工具的利器
- 带你Python入门,踏进人工智能领域
- Win10 calc.exe 无法打开计算器的解决方法
- RSA 分段加解密【解决“不正确的长度”的异常】
- C++ 函数模板的返回类型如何确定?
- Pycharm 在Windows下出现闪退问题(即是在运行一段时间后,自己就退出崩掉了)的解决方法
- MFC工程 重命名方法