B. Ela‘s Fitness and the Luxury Number

 题目链接Problem - B - Codeforces​​​​​​

题目概述:给两个数字 l 和 r,找到 l~r之间的奢侈数个数。奢侈数如下定义:对于任意非负整数x,

x/[\sqrt{x}]是整数,则称 x 为奢侈数。而 对于任意实数 r, [ r ] 表示不大于 r 的最大整数。

题解:

首先我们先研究奢侈数的性质,对于任意奢侈数 x 令,a=[\sqrt{x}],b=x/[\sqrt{x}]由奢侈数定义可知,a,b均为非负整数,且 x=a*b;由于a=[\sqrt{x}]\leq \sqrt{x},那么就有 b\geq \sqrt{x},即b\geq a

a*b=x\leq ([\sqrt{x}]+1)^{^{2}},(因为\sqrt{x}< [\sqrt{x}]+1),故有a*b\leq (a+1)^{^{2}}

----->得出a\leq b\leq a+2+1/a,那么所有满足奢侈数的组合即为 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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值