CodeForces - 813B The Golden Age(枚举,暴力区间)

The Golden Age
题 意:输入x,y,l,r。凡是由x^a+y^b组成的数都是不幸运的数组,问,l,r最多有多少连续的幸运的数。
数据范围:
2<=x,y<=1e18
1<=l<=r<=1e18

输入样例:

2 3 1 10

输出样例:

1

思 路:把l,r之间所有的不幸运的数组拍个序,然后俩个不幸运的数组之间,就是幸运的数字,记录一下最大的区间就可以了。
收 获:暴力要考虑到所有情况,经可能的分的情况尽量少而周全。不要分的特别乱。不好找Bug.
这题的暴力学到暴力的新姿势。防止越界,把乘法改成除法。具体看代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> vec;
const int maxn = 1e2+5;
ll a[maxn],b[maxn];
ll x,y,l,r;
int main(){
    scanf("%lld %lld %lld %lld",&x,&y,&l,&r);
    int lena = 1,lenb = 1;
    a[0]=b[0]=1;
    while(r/x>=a[lena-1]){   
        a[lena] = a[lena-1]*x; //乘法判断改成除法判断。防止溢出。
        lena++;
    }
    while(r/y>=b[lenb-1]){
        b[lenb] = b[lenb-1]*y;
        lenb++;
    }
    for(int i=0;i<lena;i++){
        for(int j=0;j<lenb;j++){
            ll temp = a[i] + b[j];
            if(temp>r)break;
            if(temp>=l)vec.push_back(temp);  //保证所有的数都在l,r类
        }                                   //到时候好分情况。           
    }
    sort(vec.begin(),vec.end());
    ll ans = 0;
    if(!vec.size())ans = (r-l+1);
    else{
        ans = max(vec[0]-l,r-vec[vec.size()-1]);
        for(int i=1;i<vec.size();i++){
            ans = max(vec[i]-vec[i-1]-1,ans);
        }
    }
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37129433/article/details/81667733
今日推荐