#include <iostream>
using namespace std;

int main() {
	int n;				//число от которого берется факториал
	int k;				//число на которое делится факториал числа n
	
	int primes[37] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157};
						// ^^^^ массив простых чисел, в идеале должен генерироваться динамически в самом начале - нужны все простые числа не большие k/2
	int primesCount = 37; //размер массива с простыми числами
	
	int multK[primesCount];			//массив разложения числа k на простые множители - число в массиве показывает сколько раз встречается в числе k соотвествующее простое число
	
	int multN[primesCount];			//массив разложения на простые множители числа n! Множители не больше самого большого множителя числа k
	
	for (int i=0; i<primesCount; i++)
	{
		multK[i] = 0;
		multN[i] = 0;
	}
	
	
	cin >> n >> k;
	
	//раскладываем на простые множители число k
	int current_prime = 0;		//счетчик индекса простых чисел
	int temp = k;   //еще не разложеная часть числа k
	
	while (current_prime<primesCount)
		if ( temp % primes[current_prime] == 0)
		{
			temp/=primes[current_prime];
			multK[current_prime]++;
		}
		else current_prime++;
	

	//раскладываем на простые множители факториал
	for(int i=2; i<=n; i++)
	{
		int current_prime = 0;		//счетчик индекса простых чисел
		int temp = i;		////еще не разложеная часть факториала

		while (current_prime<primesCount)
			if (multK[current_prime] > 0)			//пропускаем простые множители которых нет в числе k
			{
				if ( temp % primes[current_prime] == 0)
				{
					temp/=primes[current_prime];
					multN[current_prime]++;
				}
				else current_prime++;
			}
			else current_prime++;
	}
	

	//находим ответ - минимум от целочисельного деления массива multN на multK
	int answer = -1;
	for (int i =0; i<primesCount;i++)
		{
			if( multK[i] == 0 ) continue;
			int temp = multN[i]/multK[i];
			if (temp<answer || answer == -1) answer = temp;
		}
	
	cout << answer;
	
	return 0;
}