/*
这题今天一直RE(Runtime Error),一开始一直不明白,又怀疑到了cin对stdio的兼容,但是仍然RE
后来发现,我忽视了乘法的溢出,也就是说,仅仅只是把数据定义为long long,以满足它们的10^18量级,仍然是不够的
因为凡是乘法运算,都要警惕因为溢出变为负数的可能,这种情况下,应该把乘法用除法代替
例如:
while ( r >= (x * a[lena-1]) ) 和 while ( r >= (y * b[lenb-1]) )
改为 while ( r / x >= a[lena-1]) 和 while ( r / y >= b[lenb-1] )
另外,其实这题的思路有点类似于制表,a数组是一个以1为首项,x为公比的等比数列,直到数组元素大于r时为止,b以1为首项,y为公比的等比数列。
//------------此处可跳过------------
此外,之所以a和b的大小,定义100也不会越界,是因为题目有说 x,y >= 2, 2^99的数量级达到了10^29,超过了r的数量级10^18,所以RE并不是因为数组开小了
另外,附上RE常见的几种原因:
乘法溢出 / 除以0 / 数组越界 / 指针越界 / 使用已经释放的空间 / 数组开得太大,超过了栈的范围,造成栈溢出(栈溢出一般是函数中的数组了,函数中的数组才开在栈中);不过,其实全局的数组,也是可能溢出的,维度太小,就溢出了
//------------此处继续看------------
制完表以后,就是相加,范围内的unlucky year年份压栈,一开始我觉得,如果有重复的,不就压栈了两次吗?但其实是不会影响的,因为压栈到最后,是为了找到,不出现 unlucky year的连续几年的,最大区间的,长度...如果栈中有重复元素,无非找最大值的时候,相关数据和之前的一组一样,不会影响最大值的更新
另外两点就是,找golden year的最长长度之前,应该先将栈排序,因为求得的那些 unlucky year, 其实是几个单调递增区间拼到一起组成一个域,局部单调性保证不了总体的单调性,就像之前数学中,tanx的定义域和定义区间,可以类比一下...总之就是找前一定要先排序
如果vector空,则其中一共r-l+1个年份,没有一个lucky year,则年份数就是golden year最大值
以及,端点要单独处理,和v中的数据的处理不一样...
因为如果是左端点和vector中的第一个元素,则左端点不作为unlucky year,右端点和vector中最后一个元素,也是同理,这两种情况下,都只有一个端点作为 unlucky year,所以算区间时减去的是1(为lucky year的那一个端点)
但如果是vector中(经过排序后得到的)的两个连续元素,那么两个端点都是作为unlucky year,所以算区间时减去的是2(lucky year两个端点)
知道了区别以后,才能更好地明白,为什么要分类讨论了
最后,参考自代码:
http://blog.csdn.net/xjh_shin/article/details/72885341
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 100;
vector <LL> v;
LL a[N], b[N];
int main()
{
// cin.tie(0);
// cin.sync_with_stdio(false);
LL x, y, l, r, lena, lenb;
cin >> x >> y >> l >> r;
a[0] = b[0] = 1;
lena = lenb = 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++;
}
v.clear();
for (int i = 0; i < lena; i++)
for (int j = 0; j < lenb; j++)
{
if (a[i] + b[j] >= l)
{
if (a[i] + b[j] > r)
{
break;
}
v.push_back( a[i] + b[j] );
}
}
sort (v.begin(), v.end());
LL ans = 0;
if (!v.size()) ans = r - l + 1;
else
{
ans = max(v[0] - l, r - v[v.size() - 1]); //单独处理两个端点
//[a,b]中有(b-a+1)个元素,但是端点中有一个是unlucky year, 不算在golden age的范围里,所以在此基础上要再-1
for (int i = 1; i < v.size(); i++)
{
ans = max(ans, v[i] - v[i - 1] - 1); //处理找到的unlucky year 的vector元素
//[a,b]中有(b-a+1)个元素,但是端点都是unlucky year, 不算在golden age的范围里,所以在此基础上要再-2
}
}
cout << ans << endl;
return 0;
}