/*新经验:
算法逻辑完全正确,但输出陷入死循环导致超时,
不如看看循环条件的变量,是否沿用判断里的了,应该要开一个新数重新赋值。
如第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;
}
}