【题目】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;
}