#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int MAXN = 1000;
vector<int> Prime;
bool IsPrime[MAXN];
void Select() {   //筛法求质数
    for (int i = 0; i < MAXN; ++i) {
        IsPrime[i] = true;
    }
    IsPrime[0] = IsPrime[1] = false;
    for (int i = 2; i < MAXN; ++i) {
        if (IsPrime[i]) {
            Prime.push_back(i);
            for (int j = i * i; j < MAXN; j += i) {
                IsPrime[j] = false;
            }
        }
    }
}
int main() {
    int n, a;
    Select();
    while (scanf("%d%d", &n, &a) != EOF) {
        vector<int> prime;
        for (int i = 0; Prime[i] <= n; ++i) {    //记录小于等于n的质数
            prime.push_back(Prime[i]);
        }
        int number[MAXN];   //记录n!各个质因数的个数
        memset(number, 0, sizeof(number));
        for (int i = 2; i <= n; ++i) {     //对2到n分别进行分解质因数,统计n!质因数个数
            int temp = i;
            for (int j = 0; j < Prime.size() && Prime[j] <= temp; ++j) {
                while (temp % Prime[j] == 0) {
                    ++number[j];
                    temp /= Prime[j];
                }
            }
        }
        int number_a[MAXN];    //记录a的各个质因数个数
        memset(number_a, 0, sizeof(number_a));
        bool flag = false;    //记录a包含的质因数是否已超过n包含的质因数
        for (int i = 0; i < Prime.size() && Prime[i] <= a; ++i) {   //对a分解质因数
            while (a % Prime[i] == 0) {
                if (i > prime.size() - 1)flag = true;
                a /= Prime[i];
                ++number_a[i];
            }
        }
        int k = 1000;
        if (!flag) {    //未超过
            for (int i = 0; i < prime.size(); ++i) {
                if (number_a[i] && k > number[i] / number_a[i])k = number[i] / number_a[i];
            }
        }
        else {
            k = 0;
        }
        printf("%d\n", k);
    }
    return 0;
}