就是一个十分简单的数论题。
首先,我们设
p
为质数,
可以推知 fq,p=∑logq,pi=1(qpi−qpi+1)×i=∑logq,pi=1qpi
然后 fq,pk=∑logq,pi=1qpik
最后就可以推知: fq,∏tmpi=1pkii=mintmpi=1∑logq,pij=1qpjiki
复杂度: O(m−−√)
struct num
{
long long p,q;
num()
{
p=q=0;
}
}g[1<<20];
long long tmp;
long long n,k,ans;
int main()
{
scanf("%lld%lld",&n,&k);
fr(i,2,sqrt(k))
if(!(k%i))
{
tmp++;
g[tmp].p=i;
while(!(k%i))
{
k/=i;
g[tmp].q++;
}
_end_=sqrt(k);//减少循环次数,优化时间复杂度
}
if(k-1)
g[++tmp].p=k,g[tmp].q=1;//如果没分解完,代表剩下的一定是质数,直接加进去
ans=(1ll<<62);//设初值
fr(i,1,tmp)
{
k=n;
long long th=0;
while(k)
{
th+=k/g[i].p;
k/=g[i].p;
}
ans=min(ans,th/g[i].q);
}//这就是那个恶心的公式
printf("%lld\n",ans);
return 0;
}