codeforce 955c --Sad powers 思路+二分查找
这一题的题意是 定义一个数,该数特点是为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 思路+二分查找的更多相关文章
- Codeforces 955C Sad powers(数论)
Codeforces 955C Sad powers 题意 q组询问,每次询问给定L,R,求[L,R]区间内有多少个数可以写成ap的形式,其中a>0,p>1,1 ≤ L ≤ R ≤ 1e1 ...
- Codeforces 955C - Sad powers(数论 + 二分)
链接: http://codeforces.com/problemset/problem/955/C 题意: Q次询问(1≤Q≤1e5),每次询问给出两个整数L, R(1≤L≤R≤1e18),求所有符 ...
- Codeforces 955C Sad powers (数论)
题目链接:Sad powers 题意:给出n个l和r,求出每个给出的[l,r]之间的可以使是另外一个数的k次方的数.(k>=2) 题解:题目给出的数据范围最大是1E18所以如果要直接把所有的从1 ...
- [剑指Offer]53-在排序数组中查找数字(二分查找)
题目一 数字在排序数组中出现的个数 题目描述 统计一个数字在排序数组中出现的次数. 解决思路 写两个二分查找分别找第一个和最后一个该数字,然后可直接出计算有几个该数字.时间复杂度为O(logn). 这 ...
- LintCode_14 二分查找
题目 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. 样例 在数组 [1 ...
- 《JavaScript算法》二分查找的思路与代码实现
二分查找的思路 首先,从有序数组的中间的元素开始搜索,如果该元素正好是目标元素(即要查找的元素),则搜索过程结束,否则进行下一步. 如果目标元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半 ...
- 51 nod 1624 取余最长路 思路:前缀和 + STL(set)二分查找
题目: 写这题花了我一上午时间. 下面是本人(zhangjiuding)的思考过程: 首先想到的是三行,每一行一定要走到. 大概是这样一张图 每一行长度最少为1.即第一行(i -1) >= 1, ...
- 从一个NOI题目再学习二分查找。
二分法的基本思路是对一个有序序列(递增递减都可以)查找时,测试一个中间下标处的值,若值比期待值小,则在更大的一侧进行查找(反之亦然),查找时再次二分.这比顺序访问要少很多访问量,效率很高. 设:low ...
- 二分查找-python
约12年年底的时候,接触了python不到半年的样子,入门是直接实现GUI测试case的.今天面试地平线机器人,发现忘得差不多了- -. 当时的问题是这样的 写一个二分查找是实现,我好像不记得二分查找 ...
随机推荐
- 动态HTMl处理
后续爬虫代码的建议 尽量减少请求次数 1. 能抓列表页就不抓详情页 2. 保存获取的html页面,供差错和重复请求使用 关注网站的所有类型的页面 1. wap页面,触屏版页面 2. H5页面 3. A ...
- mui APP与服务器之间的交互原理
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- django 初始命令
1.安装django pip3 install django 2.创建一个Django对象 django-admin.py startproject 项目名称 django-admin.py star ...
- day18 十八、random、shutil、shevle、logging
一.random 模块:随机数 1. import random # .[,]整数 random randint(,) print(random.randint(, )) # 随机产生[,]中的一个数 ...
- CH 3101 - 阶乘分解 - [埃筛]
题目链接:传送门 题解: $(1e6)!$ 这种数字,表示都表示不出来,想直接 $O(\sqrt{N})$ 分解质因数这种事情就不要想了. 考虑 $N!$ 的特殊性,这个数字的所有可能包含的质因子,就 ...
- 并行开发-Task
Task 对于多线程,经常使用的是Thread.在了解Task之前,如果要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于“任务的编程模型”所冲击,这就是Tas ...
- mybatis 转义
当我们需要通过xml格式处理sql语句时,经常会用到< ,<=,>,>=等符号,但是很容易引起xml格式的错误,这样会导致后台将xml字符串转换为xml文档时报错,从而导致程序 ...
- Scrapy工作原理
目录 1. Scrapy旧版架构图(绿线是数据流向) 2. Scrapy新版架构图 1. 组件介绍 2. 数据流(Data Flow) 3. 使用Scrapy框架爬虫的重要命令 4. Middlewa ...
- 【JVM】-NO.115.JVM.1 -【JDK11 HashMap详解-4-伸展树、B树】
.Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...
- 【UML】NO.47.EBook.5.UML.1.007-【UML 大战需求分析】- 部署图(Deployment Diagram)
1.0.0 Summary Tittle:[UML]NO.47.EBook.1.UML.1.007-[UML 大战需求分析]- 部署图(Deployment Diagram) Style:Design ...