Ela‘s Fitness and the Luxury Number题解

Ela’s Fitness and the Luxury Number题解

这道题的rating是1300,是一道数论题,代码实现倒是比较简单,所以这里着重讲解公式的推导,代码贴在最后就好了

我们假设有一个数x,它的取值范围为[ i 2 i^2 i2, ( i + 1 ) 2 (i+1)^2 (i+1)2),那么它的 ⌊ x ⌋ \lfloor \sqrt{x} \rfloor x 的值就是 i i i

那么,我们来算一下在[ i 2 i^2 i2, ( i + 1 ) 2 (i+1)^2 (i+1)2)之间的符合要求的数,即[ i 2 i^2 i2, ( i + 1 ) 2 (i+1)^2 (i+1)2)之间的 i i i的倍数

我们将每个数都除以 i i i,得到 i → i + 2 + 1 i i \to i + 2 + \frac{1}{i} ii+2+i1,在这些数之间,只有 i , i + 1 , i + 2 i,i+1,i+2 i,i+1,i+2是整数,其余的都是分数

如果我们将它们重新乘上 i i i,那么就是 i 2 , i 2 + i , i 2 + 2 i i^2,i^2 + i,i^2 + 2i i2,i2+i,i2+2i,这三个值都是小于 ( i + 1 ) 2 = i 2 + 2 i + 1 (i+1)^2 = i^2 + 2i + 1 (i+1)2=i2+2i+1的。那么, x x x内符合要求的数的数量为 ( x − 1 ) ⋅ 3 + y (\sqrt{x} - 1) \sdot 3 + y (x 1)3+y

y的值为:
y = { 0 x < i 2 + i 1 i 2 + i ≤ x < i 2 + 2 i 2 x = i 2 + 2 i y=\left\{ \begin{array}{rcl} 0 & & {x < i^2+i}\\ 1 & & {i^2+i \leq x < i^2 + 2i}\\ 2 & & {x = i^2+2i} \end{array} \right. y= 012x<i2+ii2+ix<i2+2ix=i2+2i

上边就是整个的推到过程了,代码在下边

注意:这里的开根号不能用sqrt函数,会有精度问题,要用二分来写

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define ll long long

ll sum(ll x)
{
    ll l = 0, r = 1e9;
    while (l < r)
    {
        ll mid = l + r + 1 >> 1;
        if (mid * mid > x)
            r = mid - 1;
        else
            l = mid;
    }
    ll y = l;
    ll res = (y - 1) * 3;
    res -= (x < y * (y + 1));
    res -= (x < y * (y + 2));
    return res;
}

void solve()
{
    ll l, r;
    cin >> l >> r;
    cout << sum(r) - sum(l - 1) << endl;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    int t;
    cin >> t;
    while (t--)
        solve();

    return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值