/*新经验:

算法逻辑完全正确,但输出陷入死循环导致超时,
不如看看循环条件的变量,是否沿用判断里的了,应该要开一个新数重新赋值。
如第62行:
int ii=i;//必须给i开新的数运算,否则就会一直死循环然后超时

*/

//牢牢记住这句话:所有数都等与  一个或多个质数相乘的形式 
#include <iostream>
#include <vector>
using namespace std;
struct zyz
{
    int x;//质因子是谁
    int y;//x的个数
    long long z;//n有多少个x因子
};

vector<zyz> vec;//每个质因子是什么,个数

void Qvec(int a)
{
    int bound=a;
    for(int i=2;i<=bound;i++)//如果a是质数,那就=bound
    {
        int count=0;
        zyz element;
        element.x=i;
        element.y=0;
        if(a%i==0)
        {  
            while(a%i==0)
            {
                element.y++;
                a/=i;
            }
            vec.push_back(element);

        }
    }
}
int main() {
    int a, n;
    while (cin >> n >> a) { 
        
        Qvec(a);//先算出a的vec
       // long long mul=1;
  

        for(int j=0;j<vec.size();j++)vec[j].z=0;

        for(int i=2;i<=n;i++)//
        {
           // mul*=i;//用这种真的去乘阶层的方法会导致超界(long long 最大19位)
           int ii=i;//必须给i开新的数运算,否则就会一直死循环然后超时
            for(int j=0;j<vec.size();j++)
            {
                while((ii!=1)&&(ii%vec[j].x==0))
                {
                   ii/=vec[j].x;
                    vec[j].z++;
                }
            }
           
        }
     //   cout<<"mul:"<<mul<<endl;//
    //    for(int j=0;j<vec.size();j++)//
      //  {
      //      cout<<"x:"<<vec[j].x<<" y:"<<vec[j].y<<" z:"<<vec[j].z<<endl;//
      //  }//


        int k=0;

        k=(vec[0].z)/(vec[0].y);
        for(int j=0;j<vec.size();j++)
        {
            if((vec[j].z)/(vec[j].y)<k)k=(vec[j].z)/(vec[j].y);
        }
        cout<<k<<endl;
    }
}