POINT:
把k分解质因数,并存下每个质因数有几个。
再看n!里有多少个这些质因数。
取最少的倍数就ok了。
这个就是用来求n!里有多少k这个质因数的。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <string>
#include <map>
using namespace std;
#define LL long long
const int MAXN = 1e6+66;
LL n,k;
LL f(int k)
{
LL ans=0;
LL now = k;
while(now<=n){
ans+=n/now;
now=now*k;
}
return ans;
}
LL prime[MAXN+1];
void getPrime()
{
memset(prime,0,sizeof(prime));
for(int i=2;i<=MAXN;i++)
{
if(!prime[i])prime[++prime[0]]=i;
for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++)
{
prime[prime[j]*i]=1;
if(i%prime[j]==0)
break;
}
}
}
LL a[50000],cnt=0;
LL num[50000];
void ff(LL k)
{
for(int i=1;i<=prime[0];i++){
if(prime[i]>k) break;
if(k%prime[i]==0){
a[++cnt]=prime[i];
while(k%prime[i]==0){
num[cnt]++;
k/=prime[i];
}
}
}
if(k>1){
a[++cnt]=prime[k];
num[cnt]++;
}
}
int main()
{
getPrime();
scanf("%lld%lld",&n,&k);
ff(k);
LL ans=121111113123LL;
for(int i=1;i<=cnt;i++){
LL you=f(a[i]);
ans=min(ans,you/num[i]);
}
printf("%lld\n",ans);
return 0;
}