这题的具体思路楼上的 dalao 已经说清楚了,但没有代码,我这个小蒟蒻就补一发代码吧。
这道题目中的“不幸年”的个数不好确定,那么怎么办?
当然是用 C++ 的精髓 STL!
下面我来简单介绍一下 vector。
vector 的好处:
STL中有一个很好的容器 vector,它的大小根据元素的数量而改变,极其省空间。另外 vector 也有一个函数 push_back,可以直接把元素插入到一个 vector 的末尾。
那么,本题用 vector 就是再好不过啦!
vector 的定义:
vector 的定义如下:
vector<typename> name;
这相当于定义了一个一维数组 name[size],其中 size 的大小不确定,根据需要而变化。typename 可以为任意一基本类型,如 int、double、结构体等,也可以是 STL 的容器,包括 vector。
如果想定义一个二维的 vector,就可以这样:
vector<typename> name[size]
其中第一维确定,第二维不确定。
vector 的访问:
vector 的访问主要有两种形式,一种是下标访问,另一种是定一迭代器,如下:
vector<typename>::iterator it
我个人习惯用下标访问(主要是因为懒)。
vector 的常用函数:
(1) push_back() 和 pop_back
push_back()是用来在 vector 的末尾插入元素,pop_back() 则是删除。
(2)size()
size() 是用来获取 vector 里元素的个数。
(3)clear()
clear() 用来清除 vector 里的元素。
(4)begin() 和 end()
分别获取 vector 的首地址和尾地址。
还有 insert() 和 erase() 这两个请自行百度。
接下来,就是可爱的代码了:
#include<bits/stdc++.h>
using namespace std;
long long x,y,l,r;
vector<long long> v; //定义 vector
int main()
{
cin>>x>>y>>l>>r;
if(x==1) //这里需要特判,如果 x=1 或 y=1,那么无论几次幂都是一。
x=0x3f3f3f3f3f3f3f3f;
if(y==1)
y=0x3f3f3f3f3f3f3f3f;
for(long long i=1;;i*=x)
{
for(long long j=1;;j*=y)
{
if(i+j>=l&&i+j<=r) //求出满足在 [l,r] 区间内的不幸年,把它放进 vector。
v.push_back(i+j);
if(r/j<y) //如果超过了,跳出循环。
break;
}
if(r/i<x) //同上。
break;
}
sort(v.begin(),v.end()); //将整个 vector 排个序。
if(v.size()==0) //特判,如果没有一个不幸年,那么长度就是整个区间。
{
cout<<r-l+1;
return 0;
}
long long ans=max(v[0]-l,r-v[v.size()-1]); //不要忘了开头和末尾哟。
for(int i=0;i<v.size()-1;i++) //逐一计算两个不幸年之间的年数,更新答案。
ans=max(ans,v[i+1]-v[i]-1);
cout<<ans; //输出。
return 0;
}
逃(