# 970.Powerful Integers

**970.Powerful Integers**

难度:Easy

> Given two positive integers x and y, an integer is powerful if it is equal to x^i + y^j for some integers i >= 0 and j >= 0.

Return a list of all powerful integers that have value less than or equal to bound.

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]
 

Note:

1 <= x <= 100
1 <= y <= 100
0 <= bound <= 10^6
```

直观暴力解法，需要考虑特殊情况，如x、y为1的情况。

```
class Solution {
vector<int> in={2};
bool isValid(int x,int y,int num)
{
    if(x==1 && y==1) return num==2;
    if(num==x+1 || num == y+1) return true;
    int lenx=log(double(num))/log(double(x));
  //  cout <<lenx<<endl;
    for(int i=0;i<=lenx;i++)
    {
        int tmp=num-pow(x,i);
        if(tmp==0) return false;
       if( pow(y,int(log(double(tmp))/log(double(y)))) ==tmp)  return true;
    }
    return false;
}
public:
    vector<int> powerfulIntegers(int x, int y, int bound) {
        vector<int>res;
        if(bound<2) return res;
        if(x==1&& y==1) 
        {
           res.push_back(2);
            return res;
        }
        if(x<y) swap(x,y);
        if(y==1) 
        {
            bound-=1;
            int lenx= log(double(bound))/log(double(x)) ;
            for(int i=0;i<=lenx;i++)
                res.push_back(pow(x,i)+1);
            return res;
        }
        res.push_back(2);
        for(int start=y+1;start<=bound;start++)
            if(isValid(x,y,start))
                res.push_back(start);
       // cout<<isValid(x,y,bound)<<endl;
        return res;
    }
};
```

> 执行用时 :1084 ms, 在所有 C++ 提交中击败了5.60%的用户\
> 内存消耗 :8.6 MB, 在所有 C++ 提交中击败了80.70%的用户

两重遍历，长度是对数。另外需要使用集合去重。

```
class Solution {
public:
    vector<int> powerfulIntegers(int x, int y, int bound) {
        if(bound<2) return vector<int>();
        int xm= x==1 ? 1: log(double(bound))/log(double(x));
        int ym = y==1? 1: log(double(bound))/log(double(y));
       // cout<<xm<<" "<<ym<<endl;
        unordered_set<int>all;
        for(int i=0;i<=xm;i++)
        {
        for(int j=0;j<=ym;j++)
        {
            int tmp=pow(x,i)+pow(y,j);
      //     cout<<tmp<<endl;         
            if(tmp>bound) 
                break;     
            else
                if(!all.count(tmp))all.insert(tmp);
        }            
        }
        return vector<int>(all.begin(),all.end());
    }
};
```

> 执行用时 :4 ms, 在所有 C++ 提交中击败了91.60%的用户\
> 内存消耗 :8.8 MB, 在所有 C++ 提交中击败了78.07%的用户


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://dfine.gitbook.io/leetcode/970.powerful_integers.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
