//土尔逊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")