The kth Factor of n

medium math divisors

Problem

You are given two positive integers n and k. Imagine listing every factor of n — each integer from 1 to n that divides n with zero remainder — in increasing order. Return the kth entry of that list, or −1 if n has fewer than k factors. The constraints guarantee 1 ≤ k ≤ n ≤ 1000.

Inputn = 12, k = 3
Output3
The factors of 12 in ascending order are 1, 2, 3, 4, 6, 12, and the third one is 3.

def kth_factor(n, k):
    small, large = [], []
    i = 1
    while i * i <= n:
        if n % i == 0:
            small.append(i)
            if i * i != n:
                large.append(n // i)
        i += 1
    factors = small + large[::-1]
    return factors[k - 1] if k <= len(factors) else -1
function kthFactor(n, k) {
  const small = [], large = [];
  for (let i = 1; i * i <= n; i++) {
    if (n % i === 0) {
      small.push(i);
      if (i * i !== n) large.push(n / i);
    }
  }
  const factors = small.concat(large.reverse());
  return k <= factors.length ? factors[k - 1] : -1;
}
int kthFactor(int n, int k) {
    List<Integer> small = new ArrayList<>();
    List<Integer> large = new ArrayList<>();
    for (int i = 1; i * i <= n; i++) {
        if (n % i == 0) {
            small.add(i);
            if (i * i != n) large.add(n / i);
        }
    }
    Collections.reverse(large);
    small.addAll(large);
    return k <= small.size() ? small.get(k - 1) : -1;
}
int kthFactor(int n, int k) {
    vector<int> small, large;
    for (int i = 1; i * i <= n; i++) {
        if (n % i == 0) {
            small.push_back(i);
            if (i * i != n) large.push_back(n / i);
        }
    }
    small.insert(small.end(), large.rbegin(), large.rend());
    return k <= (int)small.size() ? small[k - 1] : -1;
}
Time: O(√n) Space: O(√n)