比A还签到的签到题。。。

求l-r的完全平方数的个数

我们按套路将询问拆成两个询问:

求0-r的完全平方数的个数和0-l-1的完全平方数的个数

那么,我们需要解的就是求0-x的完全平方数的个数

注意到,l可能为0,所以,可能有个询问是求0-(-1)的完全平方数的个数,这个时候特判即可

那么,我们来看看其他情况怎么做。

假设我们枚举的是完全平方数a(a=b*b),我们可以先预处理出0-1000000000内所有完全平方数,然后二分判断下即可

但是,我们有更简单的做法——枚举b

我们知道,对于0-x中,每个完全平方数对应的b一定是从0开始的连续一段数(可以反证法证明),而最大的,明显就是,所以,我们对于每个询问,输出即可

代码:

#include<bits/stdc++.h>
using namespace std;
inline int calc(int x){
    return x<0?0:sqrt(x)+1;
}
int main(){
    int n;
    scanf("%d",&n);
    while(n--){
        int x,y;
        scanf("%d%d",&x,&y);
        printf("%d\n",calc(y)-calc(x-1));
    }
    return 0;
}