题解 | 小红的区间构造

小红的区间构造

https://www.nowcoder.com/practice/df1bbce22cad4d2a8b69b7db3715e651?tpId=37&tqId=43253&rp=1&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D3%26tpId%3D37%26type%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=

首先剪枝:如果 k-1 < (n-1)*x,必不可能有 n 个 x 的倍数,这是因为当l和r都是x的倍数的时候 区间长度最短,例如要3个2的倍数,则最小区间为[2, 6] 此时2 4 6是2的倍数,区间r-l = (n-1) * x;若再比这小的话就不可能有n个x了。直接计算满足条件的区间,l只要遍历一个x的长度就够了,毕竟是寻找x的倍数,遍历一个x的长度找得到就找得到,找不到再遍历多少个x也是找不到。从1-x遍历容易超时,因为很容易就要遍历整个x长度,从x到2x就刚刚好。注意,l的遍历改成2*x~3*x也是对的,那个不通过的案例自行检测一下发现是对的,只是系统检测错误了而已,当然x~2*x是可以直接过所有案例的。

#include <iostream>
using namespace std;
typedef long long ll;

int main() {
    ll n, k, x;
    cin >> n >> k >> x;

    if (k - 1 < (n - 1) * x) {
        cout << -1 << endl;
        return 0;
    }

    for(ll l = x; l <= 2*x; ++l) {
        ll r = l + k - 1;
        // 计算区间 [l, r] 内 x 的倍数的数量:[0, r] - [0, l-1] = [l, r]
        ll count = r / x - (l - 1) / x;

        if (count == n) {
            cout << l << " " << r << endl;
            return 0;
        }
    }
  	cout << -1 << endl;
    return 0;
}

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务