#include <bits/stdc++.h>
using namespace std;
#define int long long
constexpr int INF = 1000000000000000000;
int lcm(int a, int b) {
return a * b / gcd(a, b);
}
int32_t main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
vector<int> pts;
pts.push_back(1);
pts.push_back(INF+1);
int B, N;
cin >> B >> N;
int lcmv = 1;
for (int i = 2; i <= B; i++) {
__int128 x = i;
while (x <= INF) {
pts.push_back(x);
x *= i;
}
lcmv = lcm(lcmv, i-1);
}
sort(pts.begin(), pts.end());
pts.erase(unique(pts.begin(), pts.end()));
vector<int> d(B+1, 1);
vector<__int128> X(B+1);
iota(X.begin(), X.end(), 0);
for (int i = 0; i + 1 < pts.size(); i++) {
int l = pts[i];
int r = pts[i+1]-1;
if (r < N) continue;
vector<int> say(lcmv+1, 0);
int md = -1;
for (int j = 2; j <= B; j++) {
while (X[j] <= l) X[j] *= j, d[j]++;
if (((j-1) * d[j]) % 2) goto mahmut;
if (j % 2) {
for (int a = ((j-1)*d[j]/2)%(j-1); a < lcmv; a+=j-1) {
say[a]++;
if (say[a] == B-1) assert(md==-1), md=a;
}
} else {
for (int a = 0; a < lcmv; a+=j-1) {
say[a]++;
if (say[a] == B-1) assert(md==-1), md=a;
}
}
}
if (md != -1) {
l = max(l, N);
int hh = l % lcmv;
hh = md - hh;
if (hh < 0) hh += lcmv;
l += hh;
while (l <= r) {
if (__builtin_popcountll(l)*2 == d[2]) {
for (int j = 3; j <= B; j++) {
int sum = 0;
int x = l;
while (x) {
sum += x % j;
x /= j;
}
if (sum * 2 != d[j] * (j - 1)) {
goto gg;
}
}
cout << l << endl;
exit(0);
gg:;
}
l += lcmv;
}
}
mahmut:;
}
}