#include #include template T gcd(T a, T b) { while (b > 0) { a %= b; std::swap(a, b); } return a; } class Prime { using lint = long long; public: int MAX_V; std::vector primes; std::vector isp; explicit Prime(int N) : MAX_V(N) { isp.assign(MAX_V + 1, true); isp[0] = isp[1] = false; for (int i = 2; i * i <= MAX_V; ++i) { if (isp[i]) { for (int j = i; i * j <= MAX_V; ++j) { isp[i * j] = false; } } } for (int p = 2; p <= MAX_V; ++p) { if (isp[p]) primes.push_back(p); } } bool isprime(lint N) const { if (N <= MAX_V) return isp[N]; for (lint p : primes) { if (p * p > N) break; if (N % p == 0) return false; } return true; } std::vector> factorization(lint N) const { std::vector> ret; for (lint p : primes) { if (p * p > N) break; if (N % p != 0) continue; int cnt = 0; while (N % p == 0) { N /= p; ++cnt; } ret.emplace_back(p, cnt); } if (N > 1) ret.emplace_back(N, 1); return ret; } }; const Prime P(100010); int main() { int N, K; std::cin >> N >> K; int ans = 0, maxf = 0; for (int n = 1; n < N; ++n) { auto facts = P.factorization(gcd(N, n)); int f = 0; for (auto p : facts) f += p.second; if (f < K) continue; facts = P.factorization(n); f = 1; for (auto p : facts) f *= (p.second + 1); if (maxf < f) { ans = n; maxf = f; } } std::cout << ans << std::endl; return 0; }