题目大意:如果一个数t=x^a+y^b(a,b都是大于等于0的整数)那就是一个unlucky数字。给你x,y,l,r(2 ≤ x, y ≤ 10^18, 1 ≤ l ≤ r ≤ 10^18),求出l到r内没有unlucky数字的最小区间。

解题思路:可以知道a,b最多也不会超过60(2^60>1e18),所以可以直接枚举x^a+y^b的值存到vector里,然后排序,遍历一下vector,找出v[i+1]-v[i]-1(因为两端都是unlucky数字所以要两个端点都不算在长度内)最大的区间即可。要注意vector为空和两个端点的特判。还有数字的溢出问题,这个没办法直接判断是否溢出,可以通过使用一个d=r,比如每次x次方加一的时候,就将d/x,当d==0说明x^a已经超出r的范围了。

代码:

 #include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll; vector<ll>v; int main(){
ll x,y,l,r;
cin>>x>>y>>l>>r;
ll tx,ty;
ll d1=r;
for(int i=;i<=;i++){
if(i!=)
d1/=x;
if(d1==)
break;
if(i==)
tx=;
else
tx*=x;
ll d2=r;
for(int j=;j<=;j++){
if(j!=)
d2/=y;
if(d2==)
break;
if(j==)
ty=;
else
ty*=y;
if(tx+ty>=l&&tx+ty<=r){
v.push_back(tx+ty);
}
}
}
//vector为空的情况
if(!v.size()){
cout<<r-l+<<endl;
return ;
} ll ans=;
sort(v.begin(),v.end());
for(int i=;i<v.size();i++){
//如果l不是unlucky数字,那就额外计算v[0]-l这段区间
if(i==&&v[]!=l)
ans=max(ans,v[i]-l);
//如果r不是unlucky数字,就额外计算r-v[v.size()-1]这段区间
if(i==v.size()-){
if(!sign2)
ans=max(ans,r-v[i]);
}
else
ans=max(ans,v[i+]-v[i]-);
}
cout<<ans<<endl;
}

最新文章

  1. Syslog-ng
  2. SQL Server建表和增删改
  3. ACM - ICPC World Finals 2013 B Hey, Better Bettor
  4. asp自动补全html标签自动闭合(正则表达式)
  5. SQL列数据转换为字符串
  6. OSI七层以及各层上的协议
  7. ACM学习-POJ-1125-Stockbroker Grapevine
  8. 无法识别的配置节 applicationSettings
  9. 一个简单的jQuery插件开发实例
  10. 201521123023《Java程序设计》第8周学习总结
  11. MySQL之B+树索引(转自掘金小册 MySQL是怎样运行的,版权归作者所有!)
  12. pip的更新问题
  13. js中两种for循环的使用
  14. 服务器 一 MQTT服务器硬件
  15. BI生态圈常用端口使用配置总结
  16. 输出前 k 大的数
  17. eclipse新建maven项目出现红叉解决办法
  18. mysql 时间格式化参数表笔记
  19. C++ 内存分配(new,operator new)详解
  20. python StringIO类

热门文章

  1. A2W W2A等所需要的文件
  2. SCOI2014极水的题解- -
  3. 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现
  4. pycrypto 安装
  5. 如何调整Flash与div的相互位置
  6. Stanford机器学习---第十四讲.机器学习应用举例之Photo OCR
  7. 图像PNG格式介绍
  8. echo 不换行
  9. Node + vue 实现移动官网
  10. Mongodb 备份 还原 导出 导入 等批量操作