#include #include using namespace std; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define rrep(i, n) for (int i = (int)n - 1; i > -1; i--) #define all(x) (x).begin(), (x).end() #define ll long long #define ld long double #define INF 1000000000000000000 typedef pair pll; int N, K; pll prime_factorize(long long N) { ll res1 = 0, res2 = 1; for (long long a = 2; a * a <= N; ++a) { if (N % a != 0) continue; long long ex = 0; // 指数 // 割れる限り割り続ける while (N % a == 0) { ++ex; N /= a; } // その結果を push res1 += ex; res2 *= (ex + 1); } // 最後に残った数について if (N != 1) { res1 += 1; res2 *= 2; } return {res1, res2}; } long long GCD(long long a, long long b) { if (b == 0) return a; else return GCD(b, a % b); } int main() { cin.tie(0); ios::sync_with_stdio(false); cin >> N >> K; vector tmp; for (int i = 1; i < N; i++) { int gcd = GCD(i, N); pll pri = prime_factorize(gcd); if (pri.first >= K) tmp.push_back(i); } ll en = 0, ans; rep(i, tmp.size()) { pll pri = prime_factorize(tmp[i]); if (pri.second > en) { en = pri.second; ans = tmp[i]; } else if (pri.second == en) { if (tmp[i] < ans) ans = tmp[i]; } } cout << ans << endl; return 0; }