题意:给定 n 和 b ,求 n 的阶乘在 b 进制下末尾的 0 的个数。
分析:设 则 k 就是我们要求的答案,把 b 和 n! 写成质因数分解形式:
则问题就变成了统计 n!中可以组成 b 的最小个数。求出 b 中每一个质因数 pi,并求出幂次数 ai,求出对应 n!中 pi 的幂次数 bi,则答案显而易见就是 min( bi / ai ) ;
代码:
#include<cstdio>
#include<iostream>
#define inf 1e18
using namespace std;
typedef long long ll;
ll n,b,ans;
void solve(ll x,ll num)
{
ll tmp=1,res=0;
while(tmp<=n/x) //防止溢出
{
tmp*=x;
//先累加 1—n 中能被 x 整除的个数,然后累加 能被 x^2 整除的个数,依此 x^3...x^i
//为什么这样算,因为,能被 x^i 整除的数肯定能被 x,x^2...x^(i-1) 整除,而前 i-1
//次累加已经为这个数累加了 i-1 次,只要最后累加一次就够了!
res+=n/tmp;
}
ans=min(ans,res/num);
}
int main()
{
ans=inf;
scanf("%lld%lld",&n,&b);
for(ll i=2;i*i<=b;i++)
{
if(b%i==0)
{
ll cnt=0;
while(b%i==0) b/=i,cnt++;
solve(i,cnt);
}
}
if(b>1) solve(b,1);
printf("%lld",ans);
}