这一题的题意是   定义一个数,该数特点是为a的p次方 (a>0,p>1) 再给你n个询问,每个询问给出一个区间,求区间内该数的数目。

由于给出的询问数极大(10e5) 所以,容易想到应该打个表来存储这种数。那么问题来了,如果要打1~10e18内a的2次方数的表(即1,4,9,16......)需要从1for循环到1e9,明显也会超时。思考后可以发现,如果从3次方起开始打表的话,复杂度就是从1e6开始,不会超时。所以这题,我们打出3、4、5....次方的表。并且用二分的方式找出区间内二次方的数目。(通过平方,二分出夹着区间的两个底数,然后求差,就可以得出该区间内的二次方数的数目)。期间还会有重复,比如2^4=4^2,所以我们在统计完表后需要先去重、然后再判断每个数是否是二次方数(比如前面的例子,16可以被当成是2次方数或者4次方数,但是我们应该它看成是2次方数,所以把他从表中删除)

#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
vector<long long>v1,v2;
long long sq(long long a)
{
return a*a;
}
long long efcz(long long l,long long r)
{
long long ans1,ans2,l1,r1,mid;
l1=;r1=1e9+;ans1=-;
while(l1<=r1)
{
mid=(l1+r1)/;
if(sq(mid)>=l) ans1=mid,r1=mid-;
else l1=mid+;
}
l1=;r1=1e9+;ans2=-;
while(l1<=r1)
{
mid=(l1+r1)/;
if(sq(mid)>r) ans2=mid,r1=mid-;
else l1=mid+;
}
return ans2-ans1;
}
bool check(long long a)
{
if(sq(sqrt(a))==a) return true;
if(sq(sqrt(a)+)==a) return true;
if(sq(sqrt(a)-)==a) return true;
return false;
}
int main()
{
int i,j,k,q;
long long r,l,ans,n;
v1.clear();v2.clear();
for(i=;i<=1e6;i++)
{
long long e=i;
for(j=;j<=;j++)
{
if(1e18/e<i) break;
e*=i;
if(j!=) v1.push_back(e);
}
}
sort(v1.begin(),v1.end());
v1.erase(unique(v1.begin(),v1.end()),v1.end());
int size=v1.size();
for(i=;i<size;i++) if(!check(v1[i])) v2.push_back(v1[i]);
cin>>n;
for(i=;i<n;i++)
{
ans=;
cin>>l>>r;
if(l<=) ans++;
ans+=upper_bound(v2.begin(),v2.end(),r)-lower_bound(v2.begin(),v2.end(),l);
//cout<<"qqqqqqqqqqq"<<endl;
ans+=efcz(l,r);
cout<<ans<<endl;
}
}

codeforce 955c --Sad powers 思路+二分查找的更多相关文章

  1. Codeforces 955C Sad powers(数论)

    Codeforces 955C Sad powers 题意 q组询问,每次询问给定L,R,求[L,R]区间内有多少个数可以写成ap的形式,其中a>0,p>1,1 ≤ L ≤ R ≤ 1e1 ...

  2. Codeforces 955C - Sad powers(数论 + 二分)

    链接: http://codeforces.com/problemset/problem/955/C 题意: Q次询问(1≤Q≤1e5),每次询问给出两个整数L, R(1≤L≤R≤1e18),求所有符 ...

  3. Codeforces 955C Sad powers (数论)

    题目链接:Sad powers 题意:给出n个l和r,求出每个给出的[l,r]之间的可以使是另外一个数的k次方的数.(k>=2) 题解:题目给出的数据范围最大是1E18所以如果要直接把所有的从1 ...

  4. [剑指Offer]53-在排序数组中查找数字(二分查找)

    题目一 数字在排序数组中出现的个数 题目描述 统计一个数字在排序数组中出现的次数. 解决思路 写两个二分查找分别找第一个和最后一个该数字,然后可直接出计算有几个该数字.时间复杂度为O(logn). 这 ...

  5. LintCode_14 二分查找

    题目 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. 样例 在数组 [1 ...

  6. 《JavaScript算法》二分查找的思路与代码实现

    二分查找的思路 首先,从有序数组的中间的元素开始搜索,如果该元素正好是目标元素(即要查找的元素),则搜索过程结束,否则进行下一步. 如果目标元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半 ...

  7. 51 nod 1624 取余最长路 思路:前缀和 + STL(set)二分查找

    题目: 写这题花了我一上午时间. 下面是本人(zhangjiuding)的思考过程: 首先想到的是三行,每一行一定要走到. 大概是这样一张图 每一行长度最少为1.即第一行(i -1) >= 1, ...

  8. 从一个NOI题目再学习二分查找。

    二分法的基本思路是对一个有序序列(递增递减都可以)查找时,测试一个中间下标处的值,若值比期待值小,则在更大的一侧进行查找(反之亦然),查找时再次二分.这比顺序访问要少很多访问量,效率很高. 设:low ...

  9. 二分查找-python

    约12年年底的时候,接触了python不到半年的样子,入门是直接实现GUI测试case的.今天面试地平线机器人,发现忘得差不多了- -. 当时的问题是这样的 写一个二分查找是实现,我好像不记得二分查找 ...

随机推荐

  1. UI常用接口使用规范

    //////////////////////////////////////////////////////////////////////////////////////////////// /// ...

  2. Android启动页欢迎界面大全 (网址)

    地址:http://download.csdn.net/detail/u013424496/9539810

  3. Mastering MariaDB 神秘的MariaDB 中文翻译版

    是某群的哥们义务翻译的,宣传一下,还没时间时间读,粗滤看了全部翻译完了300多页佩服 https://github.com/CMant/Mastering-MariaDB- 原地址:如果你需要读,请s ...

  4. Golang go get第三方库的坑

    在树莓派上go get fail的问题记录及解决方案 go get github.com/terrancewong/serial # 错误为GOPATH路径的问题 cannot find packag ...

  5. python逻辑运算符规则

    逻辑运算符:or and not 优先级:()>not>and>or 举例子: Print(2>1 and 1<4 or 2<3 and 9>6 or 2&l ...

  6. Qt带返回值的信号发射方式(使用QMetaObject::invokeMethod)

    一般来说,我们发出信号使用emit这个关键字来操作,但是会发现,emit并不算一个调用,所以它没有返回值.那么如果我们发出这个信号想获取一个返回值怎么办呢? 两个办法:1.通过出参形式返回,引用或者指 ...

  7. PostgreSQL 自动输入密码(转)

    原文:https://www.cnblogs.com/litmmp/p/5122534.html 在 Shell 命令行中,使用 postgresql-client 连接 PostgreSQL 数据库 ...

  8. Spark Streaming之窗口函数和状态转换函数

    流处理主要有3种应用场景:无状态操作.window操作.状态操作. reduceByKeyAndWindow import kafka.serializer.StringDecoder import ...

  9. form提交xml文件

    --为何ajax提交不了xml?--原因:Request.Form["Data"]这种获取参数方式,原本就不是mvc路由参数获取方式,这是Asp.net中webfrom页面获取参数 ...

  10. Filte过滤器

    过滤器 , 其实就是对客户端发出来的请求进行过滤. 浏览器发出, 然后服务器派servlet处理.  在中间就可以过滤, 其实过滤器起到的是拦截的作用.生活中的过滤器例如:门禁,你有门卡才能过去,没有 ...