题目链接:Problem - B - Codeforces
题目概述:给两个数字 l 和 r,找到 l~r之间的奢侈数个数。奢侈数如下定义:对于任意非负整数x,
若 是整数,则称 x 为奢侈数。而 对于任意实数 r, [ r ] 表示不大于 r 的最大整数。
题解:
首先我们先研究奢侈数的性质,对于任意奢侈数 x 令,由奢侈数定义可知,a,b均为非负整数,且 x=a*b;由于,那么就有 ,即。
而,(因为),故有
----->得出,那么所有满足奢侈数的组合即为 a*a , a*(a+1) , a*(a+2),那么我们对于数 l 内的奢侈数,就可遍历一下这三种组合小于等于 l 的情况,然后对于每一个数 a 都有 a个数满足条件那么答案一直加上a就行了。
然后对于求 l,r 之间的奢侈数明显就是 用 r 内的奢侈数个数 减去 l-1内的个数就行了,注意题目所求包含了 l ,故这里不能用r 减去 l这样会减掉符合 l 这个值的次数。对于找 a 我们可以用二分优化。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6;
long long count(long long x)//统计 x 内的奢侈数个数
{
long long res=0;
for(int i=0;i<=2;i++)//三种情况
{
long long l=0,r=1e9;
while(l<r)
{
long long mid=(l+r+1)>>1;
if(mid*(mid+i)>x) r=mid-1;
else l=mid;
}
res+=l;
}
return res;
}
void solve()
{
long long l,r;
cin>>l>>r;
long long res=0;
cout<<count(r)-count(l-1)<<"\n";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t=1;
cin>>t;
while(t--)
{
solve();
}
return 0;
}