Ela's Fitness and the Luxury Number
题意:每次给一个范围 l,r(包括端点),询问有多少数x满足 :x是根号下x向下取整的倍数。
举例子后规律很好发现,如图,每两个平方数之间有两个满足且一个在中间位置,一个在末尾位置。再考虑一下最右边r处少加的和最左边l处多加的就可以了
但但但是需要重写sqrt函数!sqrt的精度问题我也不明白唉。。。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//二分重写sqrt
ll Sqrt(ll x) {
ll left=0, right=2000000123,ans;
while (right>=left) {
ll mid=(left+right)/2;
if (mid*mid==x) return mid;
else if(mid*mid<x)
{
ans=mid;
left=mid+1;
}
else right=mid-1;
}
return ans;
}
int main()
{
ll t;
cin>>t;
while(t--)
{
ll l,r,sum=0;
cin>>l>>r;
ll p1=Sqrt(l);
ll p2=Sqrt(r);
sum+=(p2-p1)*3;
ll w=r-p2*p2;
if(w>=p2*2)sum+=3;
else if(w>=p2)sum+=2;
else if(w<p2)sum++;
ll m=l-p1*p1;
if(m>p1)sum-=2;
else if(m>0)sum--;
cout<<sum<<'\n';
cout<<'\n';
}
return 0;
}
/*
13
185269712007480489 211089414899191762
290929188916147442 532980175995437570
510037871906132163 609475341264426289
77921270569329490 377318254283917957
102179692382381057 107842368999917160
168622873887768336 805846650264985923
166300058656117763 643000070774613905
17204883412407768 199986961700164323
419719455624892920 764477397110928360
217458036602729522 248152513875231743
149782798415801930 983044781675877903
63655960110563585 144283017902142025
37094196069343297 250571824609964003
87044995
572029176
199558979
1005355647
26214104
1461157386
1182221432
948094894
679459177
95475380
1813404962
382634151
923918885
*/
如果重写sqrt的有具体精度的:
double getSqrt(int x,double precision) {
double left = 0, right = x;
while (1) {
double mid = left + (right - left) / 2;
if (fabs(x /mid - mid) < precision) return mid;
else if (x / mid > mid) left = mid + 1;
else right = mid - 1;
}
}