题意很简单,求[l,r]范围内的完全平方数个数,0<= l <= r <= 1000000000;
因为sqrt(1000000000)=31622,所以可以写一个0-31622的递增数组,在这个数组里二分找答案.
找一个左边界L使得L²>=l,再找一个右边界使得R²>r,答案就是R-L
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
const double PI = acos(-1.0);
const double eps = 1e-10;
const ll inf = 1e18;
int main(int argc, char const *argv[])
{
int num = 31625;
int a[num];
for (int i = 0; i <= num; ++i)
{
a[i] = i;
}
int n;
cin >> n;
while(n--)
{
int l, r;
cin >> l >> r;
int left = lower_bound(a, a+num+1, sqrt(l)) - a;
int right = upper_bound(a, a+num+1, sqrt(r)) - a;
cout << right - left << endl;
}
return 0;
}