#!/usr/bin/env pyoy3 import array import functools import itertools import math import operator import sys def sieve_of_eratosthenes(end, typecode="L"): assert end > 1 is_prime = array.array("B", (True for i in range(end))) is_prime[0] = False is_prime[1] = False primes = array.array(typecode) for i in range(2, end): if is_prime[i]: primes.append(i) for j in range(2 * i, end, i): is_prime[j] = False return primes def factorize_trial_division(n, typecode="L"): factors = array.array(typecode) if n < 2: return factors for p in sieve_of_eratosthenes(math.ceil(math.sqrt(n)) + 1): if p * p > n: break while n % p == 0: factors.append(p) n //= p if n > 1: factors.append(n) return factors def prod(iterable): return functools.reduce(operator.mul, iterable) def num_divisors(x): res = 0 for i in range(1, math.floor(math.sqrt(x + 0.00001)) + 1): d, m = divmod(x, i) if m == 0: res += 1 + int(d != i) return res def solve(n, k): entire_fs = factorize_trial_division(n) numd = 0 m = sys.maxsize sub_fs = itertools.combinations(entire_fs, k) for fs in sub_fs: min_prod = prod(fs) for i in range(1, n // min_prod): new_m = min_prod * i new_numd = num_divisors(new_m) if numd < new_numd or numd == new_numd and m > new_m: numd = new_numd m = new_m return m def main(): n, k = (int(z) for z in input().split()) print(solve(n, k)) if __name__ == "__main__": main()