//土尔逊Torson 编写于2023/05/13
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
#include "limits.h"
#include <vector>
#include <stdlib.h>

//质因数分解:
//把一个正整数数分解成几个质数的幂相乘的形式叫做质因数分解

using namespace std;

const int MAXN = 1000 + 100;

vector<int> prime07401;    //保存质数
bool isPrime07401[MAXN];   //标记数组

int N_arr[MAXN];
int A_arr[MAXN];
int Initial07401() {
	for (int i = 0; i < MAXN; ++i) {
		isPrime07401[i] = true;
	}
	isPrime07401[0] = false;
	isPrime07401[1] = false;
	for (int i = 2; i < MAXN; ++i) {
		if (!isPrime07401[i]) {  //非质数则跳过
			continue;
		}
		prime07401.push_back(i);
		if (i > MAXN / i) {      //只计算到 <= √MAXN
			continue;
		}
		for (int j = i*i; j < MAXN; j += i) {
			isPrime07401[j] = false;  //质数的倍数为非质数
		}
	}
	return prime07401.size();
}

void decompose_A(int a, int PrimeDivisor_len) { //对a进行质因数分解
	for (int i = 0; i < PrimeDivisor_len; i++) {
		int temp = prime07401[i];
		while (a%temp == 0) { //记录每个质因数的 次幂数 
			A_arr[temp]++;
			a /= temp;
		}
	}
}

void decompose_N(int n, int PrimeDivisor_len) { //对n进行质因数分解
	for (int i = 0; i < PrimeDivisor_len; i++) {
		int temp = prime07401[i];
		while (n%temp == 0) { //记录每个质因数的 次幂数 
			N_arr[temp]++;
			n /= temp;
		}
	}
}

int main() {
	int n, a;
	int PrimeDivisor_len = Initial07401(); 
	while (scanf("%d%d", &n, &a) != EOF) {
		memset(N_arr, 0, sizeof(int)*MAXN); //初始化 N_arr,A_arr 为 MAXN 大小的 0
		memset(A_arr, 0, sizeof(int)*MAXN);
		decompose_A(a, PrimeDivisor_len);//把a进行质因数分解
		for (int i = 2; i <= n; i++) {//把2~N进行质因数分解
			decompose_N(i, PrimeDivisor_len);
		}
		int k = INT_MAX;
		for (int i = 2; i < a; i++) { //a^k=a*a*a...*a(k个a相乘)
			if (N_arr[i] != 0 && A_arr[i] != 0) {//看把2~n分解的质因数中包含多少(倍的)a的质因数
				if (N_arr[i] / A_arr[i] < k) {//找最小次幂,是因为找最小公倍数的次幂 k 大于它的数 就是更大的整除次幂数
					k = N_arr[i] / A_arr[i];
				}
			}
		}
		printf("%d\n", k);
	}
	return EXIT_SUCCESS;
}
// 64 位输出请用 printf("%lld")