Powerful Integers

medium math enumeration set

Problem

Given three integers x, y, and bound, return a list of all powerful integers that have a value less than or equal to bound. An integer is powerful if it can be written as xi + yj for some integers i >= 0 and j >= 0. You may return the answer in any order; it must contain no duplicates.

Inputx = 2, y = 3, bound = 10
Output[2, 3, 4, 5, 7, 9, 10]
2 = 2^0 + 3^0, 3 = 2^1 + 3^0, 4 = 2^0 + 3^1, 5 = 2^1 + 3^1, 7 = 2^2 + 3^1, 9 = 2^3 + 3^0, 10 = 2^0 + 3^2.

def powerful_integers(x, y, bound):
    result = set()
    a = 1
    while a <= bound:
        b = 1
        while a + b <= bound:
            result.add(a + b)
            if y == 1:
                break
            b *= y
        if x == 1:
            break
        a *= x
    return list(result)
function powerfulIntegers(x, y, bound) {
  const result = new Set();
  for (let a = 1; a <= bound; a *= x) {
    for (let b = 1; a + b <= bound; b *= y) {
      result.add(a + b);
      if (y === 1) break;
    }
    if (x === 1) break;
  }
  return [...result];
}
class Solution {
    public List<Integer> powerfulIntegers(int x, int y, int bound) {
        Set<Integer> result = new HashSet<>();
        for (int a = 1; a <= bound; a *= x) {
            for (int b = 1; a + b <= bound; b *= y) {
                result.add(a + b);
                if (y == 1) break;
            }
            if (x == 1) break;
        }
        return new ArrayList<>(result);
    }
}
vector<int> powerfulIntegers(int x, int y, int bound) {
    unordered_set<int> result;
    for (int a = 1; a <= bound; a *= x) {
        for (int b = 1; a + b <= bound; b *= y) {
            result.insert(a + b);
            if (y == 1) break;
        }
        if (x == 1) break;
    }
    return vector<int>(result.begin(), result.end());
}
Time: O(logxbound · logybound) Space: O(logxbound · logybound)