970. Powerful Integers
Given three integers x, y, and bound, return a list of all the powerful integers that have a value less than or equal to bound.
An integer is powerful if it can be represented as x^i + y^j for some integers i >= 0 and j >= 0.
You may return the answer in any order. In your answer, each value should occur at most once.
Example 1:
Input: x = 2, y = 3, bound = 10
Output: [2,3,4,5,7,9,10]
Explanation:
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
Example 2:
Input: x = 3, y = 5, bound = 15
Output: [2,4,6,8,10,14]
Constraints:
- 1 <= x, y <= 100
- 0 <= bound <= 10^6
Solution:
Ideas:
- A powerful integer is any number that can be written as x^i + y^j where i, j ≥ 0.
- Precompute all powers of x and y that do not exceed bound.
- Special case: if x == 1 or y == 1, only one power (1) exists for that base.
- Combine every x^i with every y^j and compute the sum.
- Use a seen array (or hash set) to avoid duplicates.
- Only keep sums ≤ bound.
- Collect all marked sums and return them as the final list.
Code:
/** Note: The returned array must be malloced, assume caller calls free(). */
int* powerfulIntegers(int x, int y, int bound, int* returnSize){
if(bound < 2){
*returnSize = 0;
return NULL;
}
// Precompute powers of x and y up to `bound`
xp[], yp[];
xn = , yn = ;
val = ;
(val <= bound){
xp[xn++] = val;
(x == ) ;
(val > bound / x) ;
val *= x;
}
val = ;
(val <= bound){
yp[yn++] = val;
(y == ) ;
(val > bound / y) ;
val *= y;
}
* seen = (*)(bound + , ());
(!seen){
*returnSize = ;
;
}
count = ;
( i = ; i < xn; ++i){
( j = ; j < yn; ++j){
sum = xp[i] + yp[j];
(sum > bound) ;
(!seen[sum]){
seen[sum] = ;
count++;
}
}
}
* res = (*)(()* count);
(!res){
(seen);
*returnSize = ;
;
}
idx = ;
( s = ; s <= bound; ++s){
(seen[s]){
res[idx++] = s;
}
}
(seen);
*returnSize = count;
res;
}


