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的.今天面试地平线机器人,发现忘得差不多了- -. 当时的问题是这样的 写一个二分查找是实现,我好像不记得二分查找 ...
随机推荐
- 五、Java基础加强
Java基础加强 1.MyEclipse的使用工作空间(workspace).工程(project)在eclipse下Java程序的编写和运行,及java运行环境的配置.快捷键的配置,常用快捷键:内容 ...
- 请大神留言:使用static方法和从Spring IOC 容器里面取出的方法有什么区别????
类的静态方法,不用new出对象,因为它在类的初始化阶段加载到jvm内存的. 而spring容器,是在启动服务的时候,new出容器所管理的对象. 本质区别就是一个在堆中产生了对象,一个没产生对象只在方法 ...
- MOT南京站 | 卓越研发之路:锻造顶级后端系统
代码是互联网企业信息化核心,也是众多研发团队智慧的结晶,如何将代码发挥到最大价值?如何用代码快.准.好的实现需求?相信这是很多IT从业者所困扰的问题. MOT南京站首期以『锻造顶级后端系统』为主题,我 ...
- ADB命令(全)
当熟悉Shell命令的人使用adb是没有任何难度的,因为adb中绝大多少命令都是引用的shell命令 以下命令进行归类,红色部分字体是测试人员常用的adb命令 基础命令 1.启动adb服务 adb s ...
- java框架之SpringBoot(13)-检索及整合Elasticsearch
ElasticSearch介绍 简介 我们的应用经常需要使用检索功能,开源的 Elasticsearch 是目前全文搜索引擎的首选.它可以快速的存储.搜索和分析海量数据.SpringBoot 通过整合 ...
- Spring中bean标签的属性和值:
Spring中bean标签的属性和值: <bean name="user" class="com.pojo.User" init-method=" ...
- MATLAB变量
序言 在Matlab中,变量名由A~Z.a~z.数字和下划线组成,且变量的第一个字符必须是字母. 尽管变量名可以是任意长度, 但是Matlab只识别名称的前N=namelengthmax个字符, 这里 ...
- Centos配置tomcat服务并且开机自启动
把要配置成服务的tomcat文件夹中的catalina.sh脚本文件拷一份到/etc/init.d目录,并且改文件名称为tomcat6 cp /usr/web/tomcat/tomcat-/bin/c ...
- Asianux 7.3安装Oracle 11.2.0.4单实例体验
环境:Asianux 7.3 需求:安装Oracle 11.2.0.4 单实例 背景:系统使用默认的最小安装部署,Oracle安装额外需要的包统一使用yum安装. 查看当前系统相关信息: [root@ ...
- SQL SERVER 备份脚本
DECLARE @FileName VARCHAR(200), @CurrentTime VARCHAR(50), @DBName VARCHAR(100), @SQL VARCHAR(1000)SE ...