【Code Forces】813 B The Golden Age

【题目】http://codeforces.com/problemset/problem/813/B

【题意】给出x,y,l,r,如果一个数是x的幂+y的幂那么它是 unluck 的 。

               如果一连串的数都不是 unluck 的,它们被称作Golden Age。

              求l到r之间G.A.的最大长度

【思路】因为数据在10e18内,x和y的幂分别最多枚举64次以内就能枚举完这个数。所以所有小于r的 unluck 放到一起,在区间里操作以下取最长的GA区间即可

【代码】

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll x,y,l,r;

vector<ll>v;

//全用 - / 代替 + * ,防止爆long long
void putinv()//枚举符合条件的数放进vector
{
    ll tem1=1;
    for(int i=0; i<100; i++)
    {
        ll tem2=1;//t1,t2都是从0次幂开始枚举
        for(int j=0; j<100; j++)
        {
            if(tem2>r-tem1)//如果t1+t2>r,break
                break;
            v.push_back(tem2+tem1);
            if(tem2>r/y)//如果t2*y>r,break
                break;
            tem2*=y;
        }
        if(tem1>r/x)//如果t1*x>r,break
            break;
        tem1*=x;
    }
}


int main()
{
    cin>>x>>y>>l>>r;
    putinv();
    sort(v.begin(),v.end());
    ll ans=0;

    for(int i=0; i<v.size()-1; i++)
    {
        if(v.size()==0)
            break;
        if(v[i]==v[i+1])
        {
            v.erase(v.begin()+i);
        }
    }
//    for(auto x:v)
//    {
//        cout<<x<<" ";
//    }
//    cout<<endl;
    if(v.empty())//如果没放进来一个unluck,那么l-r全是GA
        ans=r-l+1;
    else if(l>v[v.size()-1]||r<v[0])如果符合条件的数都不在l-r之间,那么l-r全是GA
        ans=r-l+1;
    else
    {
        for(unsigned int i=0; i<v.size()-1; i++)
        {
            if(i==v.size()-2&&v[i+1]<r)
            {
                ans=max(ans,r-v[i+1]);
            }
            if(v[i+1]<l)
                continue;
            if(v[i]<l&&v[i+1]>l)
                ans=max(ans,v[i+1]-l);
            else if(v[i]>=l&&v[i+1]>l&&v[i]<r&&v[i+1]<=r)
            {
                ans=max(ans,v[i+1]-v[i]-1ll);
            }
            else if(v[i+1]>r&&v[i]<r)
                ans=max(ans,r-v[i]);

        }

    }

    cout<<ans;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值