遍历左边界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;
}



京公网安备 11010502036488号