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