参考:
CF#538 C - Trailing Loves (or L'oeufs?) /// 分解质因数
简单的讲解:
求n!在10进制下末尾0的个数,由于2*5=10,(2,5是质数)所以就是求n!里有几个min(2的个数,5的个数),由于2的个数远大于5的个数,所以我们只找有几个5就行了,比如计算25!的末尾0的个数,25!中包含5的有5,10,15,20,25,其中25中包含两个5,所以一共包含6个5,即25!的末尾有6个0。
求n!在3进制下末尾0的个数,即找n!里有几个3。
求n!在9进制下末尾0的个数,由于3*3=9,即找n!里有几个3*3,即3的个数除以2。
详细讲解见上面的两个链接。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1e18+1;
ll pri[10010];
ll sumx[10010];
ll index=0;
void getpri(ll m)//分解质因数
{
for(ll i=2;i*i<=m;i++)
{
while(m%i==0)
{
pri[index]=i;
sumx[index]++;
m/=i;
}
if(sumx[index]) index++;
}
if(m>1) pri[index]=m, sumx[index++]=1;
}
ll getsumX(ll n,ll p)//n!能分解出sumX个p
{
ll sumX=0;
while(n>0)
{
sumX+=n/p;
n/=p;
}
return sumX;
}
int main()
{
ll n,m,ans=maxn;
cin>>n>>m;
getpri(m);
for(ll i=0;i<index;i++) ans=min(ans,getsumX(n,pri[i])/sumx[i]);
cout<<ans<<endl;
}