题目
多次查询[l,r]范围内的完全平方数个数
定义整数x为完全平方数当且仅当可以找到整数y使得y*y=x
范围
n <= 100000
0<= l <= r <= 1000000000
题意理解
第一眼看到多次查询[l,r]范围的时候,还以为是一道线段树。后来发现好像没有那么复杂。
官方题解
[1,n]中完全平方数个数就是sqrt( n )
注意特判0
我的解释
根据这个官方题解,我们可以知道,[1,l),也就是[1,l-1]内完全平方数的个数为 l−1−−−−√ ,那么[0,l-1]内的完全平方数个数为 l−1−−−−√+1 ;[0,r]内的完全平方数为 r√+1 。那么,[l,r]内的完全平方数个数,就是 r√+1−(l−1−−−−√+1) 。当然需要注意特判0。
代码
注意一下对于0是有特判的。0在左边的时候,[0, -1]完全平方数数量为0,0在右边的时候,[0, 0]完全平方数数量为1。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
scanf("%d", &n);
int l, r;
for(int i = 0 ;i < n; i++){
scanf("%d %d", &l, &r);
if(l == 0){
l = 0;
} else {
l = sqrt(l - 1) + 1;
}
if(r == 0) {
r = 1;
} else {
r = sqrt(r) + 1;
}
printf("%d\n", r - l);
}
return 0;
}