题解 | 小红的区间构造
小红的区间构造
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; }