#include <iostream>
#include <vector>
#include <map>
using namespace std;
vector<int> getPrimes(int max) {
    vector<int> primes;
    bool num[max + 1];
    for (int i = 2; i <= max; i++) {
        num[i] = true;
    }
    num[0] = num[1] = false;
    for (int i = 2; i <= max; i++) {
        if (num[i] = true) {
            primes.push_back(i);
            for (int j = i * i; j <= max; j += i) {
                num[j] = false;
            }
        }
    }
    return primes;
}
int main() {
    int n, a;
    vector<int> primes = getPrimes(1000);
    while (cin >> n >> a) { // 注意 while 处理多个 case
        // cout << a + b << endl;
        map<int, int> n_primeCount; //质因数,幂次数
        map<int, int> a_primeCount;
        for (int i = 2; i <= n; i++) {
            int temp = i;
            for (auto prime : primes) {
                if (prime > temp) break;
                while (temp % prime == 0) {
                    n_primeCount[prime]++;
                    temp /= prime;
                }
            }
        }
        for (auto prime : primes) {
            if (prime > a) break;
            while (a % prime == 0) {
                a_primeCount[prime]++;
                a /= prime;
            }
        }
        int min = 2147483647;//寻找幂次数之比最小值
        for (auto it = a_primeCount.begin(); it != a_primeCount.end(); it++) {
            if (n_primeCount.find(it->first) == n_primeCount.end()) {//N!的质因数中不存在a的质因数
                min = 0;
                break;
            }
            if (n_primeCount[it->first] % it->second != 0) {//n!的质因数的幂次数不能被a的质因数的幂次数整除
                min = 0;
                break;
            }
            int temp = n_primeCount[it->first] / it->second;
            if (temp < min) min = temp;
        }
        cout << min << endl;
    }
}
// 64 位输出请用 printf("%lld")