由于sqrt(10e)=31622,题目也说了1-10e内有31622个完全平方数,所以我们就可以建立一个0-31622的递增数组,然后在数组中二分查找答案。假设有一个0-r的区间,这个区间内的完全平方数最多有sqrt(r)个。所以求l-r区间内的完全平方数时,我们在数组中找到第一个>=sqrt(l)的位置,再找到第一个>sqrt(r)的位置,两个位置相减就是答案
#include<bits/stdc++.h> using namespace std; const int N =31625; int a[N]; int main() { for(int i=0;i<N;++i)a[i]=i; int n,l,r; cin>>n; while(n--){ cin>>l>>r; int L=0,R=N; L=lower_bound(a,a+N,sqrt(l))-a; R=upper_bound(a,a+N,sqrt(r))-a; cout<<max(R-L,0)<<endl; } return 0; }