#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 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG1haW4oKSB7CglpbnQgbjsJCQkJLy/Rh9C40YHQu9C+INC+0YIg0LrQvtGC0L7RgNC+0LPQviDQsdC10YDQtdGC0YHRjyDRhNCw0LrRgtC+0YDQuNCw0LsKCWludCBrOwkJCQkvL9GH0LjRgdC70L4g0L3QsCDQutC+0YLQvtGA0L7QtSDQtNC10LvQuNGC0YHRjyDRhNCw0LrRgtC+0YDQuNCw0Lsg0YfQuNGB0LvQsCBuCgkKCWludCBwcmltZXNbMzddID0gezIsIDMsIDUsIDcsIDExLCAxMywgMTcsIDE5LCAyMywgMjksIDMxLCAzNywgNDEsIDQzLCA0NywgNTMsIDU5LCA2MSwgNjcsIDcxLCA3MywgNzksIDgzLCA4OSwgOTcsIDEwMSwgMTAzLCAxMDcsIDEwOSwgMTEzLCAxMjcsIDEzMSwgMTM3LCAxMzksIDE0OSwgMTUxLCAxNTd9OwoJCQkJCQkvLyBeXl5eINC80LDRgdGB0LjQsiDQv9GA0L7RgdGC0YvRhSDRh9C40YHQtdC7LCDQsiDQuNC00LXQsNC70LUg0LTQvtC70LbQtdC9INCz0LXQvdC10YDQuNGA0L7QstCw0YLRjNGB0Y8g0LTQuNC90LDQvNC40YfQtdGB0LrQuCDQsiDRgdCw0LzQvtC8INC90LDRh9Cw0LvQtSAtINC90YPQttC90Ysg0LLRgdC1INC/0YDQvtGB0YLRi9C1INGH0LjRgdC70LAg0L3QtSDQsdC+0LvRjNGI0LjQtSBrLzIKCWludCBwcmltZXNDb3VudCA9IDM3OyAvL9GA0LDQt9C80LXRgCDQvNCw0YHRgdC40LLQsCDRgSDQv9GA0L7RgdGC0YvQvNC4INGH0LjRgdC70LDQvNC4CgkKCWludCBtdWx0S1twcmltZXNDb3VudF07CQkJLy/QvNCw0YHRgdC40LIg0YDQsNC30LvQvtC20LXQvdC40Y8g0YfQuNGB0LvQsCBrINC90LAg0L/RgNC+0YHRgtGL0LUg0LzQvdC+0LbQuNGC0LXQu9C4IC0g0YfQuNGB0LvQviDQsiDQvNCw0YHRgdC40LLQtSDQv9C+0LrQsNC30YvQstCw0LXRgiDRgdC60L7Qu9GM0LrQviDRgNCw0Lcg0LLRgdGC0YDQtdGH0LDQtdGC0YHRjyDQsiDRh9C40YHQu9C1IGsg0YHQvtC+0YLQstC10YHRgtCy0YPRjtGJ0LXQtSDQv9GA0L7RgdGC0L7QtSDRh9C40YHQu9C+CgkKCWludCBtdWx0TltwcmltZXNDb3VudF07CQkJLy/QvNCw0YHRgdC40LIg0YDQsNC30LvQvtC20LXQvdC40Y8g0L3QsCDQv9GA0L7RgdGC0YvQtSDQvNC90L7QttC40YLQtdC70Lgg0YfQuNGB0LvQsCBuISDQnNC90L7QttC40YLQtdC70Lgg0L3QtSDQsdC+0LvRjNGI0LUg0YHQsNC80L7Qs9C+INCx0L7Qu9GM0YjQvtCz0L4g0LzQvdC+0LbQuNGC0LXQu9GPINGH0LjRgdC70LAgawoJCglmb3IgKGludCBpPTA7IGk8cHJpbWVzQ291bnQ7IGkrKykKCXsKCQltdWx0S1tpXSA9IDA7CgkJbXVsdE5baV0gPSAwOwoJfQoJCgkKCWNpbiA+PiBuID4+IGs7CgkKCS8v0YDQsNGB0LrQu9Cw0LTRi9Cy0LDQtdC8INC90LAg0L/RgNC+0YHRgtGL0LUg0LzQvdC+0LbQuNGC0LXQu9C4INGH0LjRgdC70L4gawoJaW50IGN1cnJlbnRfcHJpbWUgPSAwOwkJLy/RgdGH0LXRgtGH0LjQuiDQuNC90LTQtdC60YHQsCDQv9GA0L7RgdGC0YvRhSDRh9C40YHQtdC7CglpbnQgdGVtcCA9IGs7ICAgLy/QtdGJ0LUg0L3QtSDRgNCw0LfQu9C+0LbQtdC90LDRjyDRh9Cw0YHRgtGMINGH0LjRgdC70LAgawoJCgl3aGlsZSAoY3VycmVudF9wcmltZTxwcmltZXNDb3VudCkKCQlpZiAoIHRlbXAgJSBwcmltZXNbY3VycmVudF9wcmltZV0gPT0gMCkKCQl7CgkJCXRlbXAvPXByaW1lc1tjdXJyZW50X3ByaW1lXTsKCQkJbXVsdEtbY3VycmVudF9wcmltZV0rKzsKCQl9CgkJZWxzZSBjdXJyZW50X3ByaW1lKys7CgkKCgkvL9GA0LDRgdC60LvQsNC00YvQstCw0LXQvCDQvdCwINC/0YDQvtGB0YLRi9C1INC80L3QvtC20LjRgtC10LvQuCDRhNCw0LrRgtC+0YDQuNCw0LsKCWZvcihpbnQgaT0yOyBpPD1uOyBpKyspCgl7CgkJaW50IGN1cnJlbnRfcHJpbWUgPSAwOwkJLy/RgdGH0LXRgtGH0LjQuiDQuNC90LTQtdC60YHQsCDQv9GA0L7RgdGC0YvRhSDRh9C40YHQtdC7CgkJaW50IHRlbXAgPSBpOwkJLy8vL9C10YnQtSDQvdC1INGA0LDQt9C70L7QttC10L3QsNGPINGH0LDRgdGC0Ywg0YTQsNC60YLQvtGA0LjQsNC70LAKCgkJd2hpbGUgKGN1cnJlbnRfcHJpbWU8cHJpbWVzQ291bnQpCgkJCWlmIChtdWx0S1tjdXJyZW50X3ByaW1lXSA+IDApCQkJLy/Qv9GA0L7Qv9GD0YHQutCw0LXQvCDQv9GA0L7RgdGC0YvQtSDQvNC90L7QttC40YLQtdC70Lgg0LrQvtGC0L7RgNGL0YUg0L3QtdGCINCyINGH0LjRgdC70LUgawoJCQl7CgkJCQlpZiAoIHRlbXAgJSBwcmltZXNbY3VycmVudF9wcmltZV0gPT0gMCkKCQkJCXsKCQkJCQl0ZW1wLz1wcmltZXNbY3VycmVudF9wcmltZV07CgkJCQkJbXVsdE5bY3VycmVudF9wcmltZV0rKzsKCQkJCX0KCQkJCWVsc2UgY3VycmVudF9wcmltZSsrOwoJCQl9CgkJCWVsc2UgY3VycmVudF9wcmltZSsrOwoJfQoJCgoJLy/QvdCw0YXQvtC00LjQvCDQvtGC0LLQtdGCIC0g0LzQuNC90LjQvNGD0Lwg0L7RgiDRhtC10LvQvtGH0LjRgdC10LvRjNC90L7Qs9C+INC00LXQu9C10L3QuNGPINC80LDRgdGB0LjQstCwIG11bHROINC90LAgbXVsdEsKCWludCBhbnN3ZXIgPSAtMTsKCWZvciAoaW50IGkgPTA7IGk8cHJpbWVzQ291bnQ7aSsrKQoJCXsKCQkJaWYoIG11bHRLW2ldID09IDAgKSBjb250aW51ZTsKCQkJaW50IHRlbXAgPSBtdWx0TltpXS9tdWx0S1tpXTsKCQkJaWYgKHRlbXA8YW5zd2VyIHx8IGFuc3dlciA9PSAtMSkgYW5zd2VyID0gdGVtcDsKCQl9CgkKCWNvdXQgPDwgYW5zd2VyOwoJCglyZXR1cm4gMDsKfQ==