题目

求十进制 \(n!\) 在 \(m\) 进制下末尾 \(0\) 的个数

分析

签到题

只要看 \(n!\) 有多少个 \(m\) 的倍数就好了

考虑分解 \(m\) 的质因子

然后根号计算每个因子在 \(n!\) 中有多少个

取能取到的最小值就行了

\(Code\)

#include<cstdio>
using namespace std;
typedef long long LL; const int N = 1e6 + 10;
int vis[N] , pr[N] , tot , cnt;
LL zhi[N] , hav[N] , num[N]; inline void getprime()
{
vis[1] = 1;
for(register int i = 2; i <= N - 5; i++)
{
if (!vis[i]) pr[++tot] = i;
for(register int j = 1; j <= tot && i * pr[j] <= N - 5; j++)
{
vis[i * pr[j]] = 1;
if (i % pr[j] == 0) break;
}
}
} int main()
{
getprime();
int T; LL n , m;
scanf("%d" , &T);
for(; T; T--)
{
cnt = 0;
scanf("%lld%lld" , &n , &m);
for(register int i = 1; i <= tot; i++)
if (m % pr[i] == 0)
{
num[++cnt] = pr[i] , zhi[cnt] = 0;
while (m % pr[i] == 0) zhi[cnt]++ , m /= pr[i];
}
if (m != 1 && m) num[++cnt] = m , zhi[cnt] = 1;
LL ans = 9e18;
for(register int i = 1; i <= cnt; i++)
{
LL s = num[i];
hav[i] = 0;
while (n >= s)
{
hav[i] += n / s;
if (s <= n / (LL)num[i]) s = s * (LL)num[i];
else break;
}
if (hav[i] / zhi[i] < ans) ans = hav[i] / zhi[i];
}
printf("%lld\n" , ans == 9e18 ? 0 : ans);
}
}

最新文章

  1. canvas简介
  2. thinkphp __PUBLIC__的定义 __ROOT__等常量的定义
  3. Linux tar指令
  4. mfc110ud.dll not found
  5. 程序自动生成Dump文件
  6. How to use BMW Multi Tool 7.3 to replace lost key for BMW X1
  7. Service Fabric service 根据环境变量读取配置文件
  8. 【原创】navicat for sqlite 11.1.12 patch 永久试用 不报毒
  9. 如何发起、防御和测试XSS攻击,我们用DVWA来学习(上)
  10. H5调用手机拍照并展示在前端页面
  11. 如何使用Senparc.Weixin SDK 底层的Redis缓存并设置过期时间
  12. mysql 表结构
  13. 五分钟搞清楚MySQL事务隔离级别
  14. vins-mono代码解读
  15. 关于reduce输出write方法
  16. 各种排序算法(java)
  17. [翻译]Restful Web服务模型
  18. OAF_OAF编译代码至应用详解(案例)
  19. flume采集启动报错,权限不够
  20. mysql数据库要按当天、昨天、前七日、近三十天、季度、年查询

热门文章

  1. redux原理分享
  2. orcl rollup 分组小计、合计
  3. TKE 超级节点,Serverless 落地的最佳形态
  4. python之xlsx合并单元格
  5. 异构混排在vivo互联网的技术实践
  6. SQLMap入门——获取当前网站数据库的用户名称
  7. python安装与初识
  8. java初级开发面试题
  9. Spark详解(06) - SparkSQL
  10. CentOS7.6搭建Hadoop2.7.2运行环境-三节点集群模式