题解 | 小红的区间构造
小红的区间构造
https://www.nowcoder.com/practice/df1bbce22cad4d2a8b69b7db3715e651
遍历左边界l即可,从1~n*x直接for循环遍历会超时,这里用二分法对l进行遍历,且不用再对[l, r]内的值进行for循环遍历一遍了,直接用r/x - (l-1)/x即可得到[l, r]内x的倍数个数,除法都是向下取整
#include <iostream> using namespace std; int main() { int n, k, x; cin >> n >> k >> x; // 剪枝:如果 k-1 < (n-1)*x,必不可能有 n 个 x 的倍数 if (k - 1 < (n - 1) * x) { cout << -1 << endl; return 0; } // 二分查找 l 的范围 int left = 1; int right = x * n; // l 的最大可能值 int result_l = -1, result_r = -1; while (left <= right) { int mid = left + (right - left) / 2; int r = mid + k - 1; int count = r / x - (mid - 1) / x; if (count == n) { result_l = mid; result_r = r; break; } else if (count < n) { left = mid + 1; } else { right = mid - 1; } } if (result_l != -1) { cout << result_l << " " << result_r << endl; } else { cout << -1 << endl; } return 0; }