题目链接:传送门

题解:

$(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';
}
}

最新文章

  1. Spark运行模式与Standalone模式部署
  2. centos mysql php Curl
  3. MySQL性能优化的最佳21条经验
  4. mybatis配置优化
  5. [RabbitMQ] AMQP close-reason, initiated by Library, code=541
  6. Java、fileless恶意软件威胁桌面安全
  7. MFC程序中消息以及函数的处理顺序简介[转]
  8. 转载RabbitMQ入门(1)--介绍
  9. Oracle创建触发器实现主键自增
  10. git命令(流程)
  11. *[codility]Number-of-disc-intersections
  12. Unity重要的函数
  13. Sublime Text 3 使用MarkDown编写带预览的文本
  14. Ubuntu 14 安装WPS
  15. CTypes
  16. 关于Tcpdump抓包总结
  17. axure交互样式(下拉列表和矩形)
  18. 全文检索Solr集成HanLP中文分词
  19. JAVA课堂动手动脑实验--方法的重载定义,组合数的递归算法
  20. url下载文件到本地

热门文章

  1. MySQL 的 autocommit
  2. MinFilter(MaxFilter)快速算法C++实现
  3. 怎么样加快JavaScript加载和执行效率
  4. webstorm11.0下载地址和webstorm11.0破解程序patcher.exe下载使用方法说明 前端IDE工具的利器
  5. 带你Python入门,踏进人工智能领域
  6. Win10 calc.exe 无法打开计算器的解决方法
  7. RSA 分段加解密【解决“不正确的长度”的异常】
  8. C++ 函数模板的返回类型如何确定?
  9. Pycharm 在Windows下出现闪退问题(即是在运行一段时间后,自己就退出崩掉了)的解决方法
  10. MFC工程 重命名方法