首先剪枝:如果 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;
}



京公网安备 11010502036488号