---
# System prepended metadata

title: Solution Lũy thừa

---

# Solution Lũy thừa
link đề: https://oj.vnoi.info/problem/power

## Tóm đề
- dòng đầu đề cho t là số test case
- mỗi t dòng tiếp theo sẽ có 2 số l và r
- yêu cầu tìm số k lớn nhất sao cho thỏa mãn $l\le x^k\le r$
## Hướng giải
vì $2^{40}>10^{12}$ nên ta có thể cho chạy for k từ 39 trở xuống
dùng binary search để kiểm tra xem liệu có $x$ tồn tại thỏa mãn điều kiện ko
nếu không thì hạ k xuống và tiếp tục kiểm tra
## Code mẫu
```cpp=
#include<iostream>
#include<cmath>
using namespace std;
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int t;
    cin>>t;
    for(int j=1;j<=t;j++){
        //for j cho mỗi test case
        long long l,r,ans=1;
        cin>>l>>r;
        long long lo,hi,mid,b=2;
        for(long long i=39;i>1;i--){
            //for i thử mỗi số mũ k

            while(pow(b,i)<r)b*=2;
            //xác định biên trên hi
            hi=b;lo=2;//biên dưới lo
            while(lo<hi){
                //binary search
                mid=(lo+hi)/2;
                
                if(pow(mid,i)>r)hi=mid;
                //ko -1 tránh mất số
                //lí do vì ko check mid trước :b
                else if(pow(mid,i)<l)lo=mid+1;
                //+1 tránh lặp vô hạn
                else{
                    //tìm đc k lớn nhất
                    ans=i;
                    break;
                }
            }
            if(ans!=1)break;
            //đã có kết quả, dừng lặp
        }
        cout<<"Case #"<<j<<": "<<ans<<endl;
    }
}
```