感觉是二分,求优化
查看原帖
感觉是二分,求优化
1197264
David0225楼主2024/10/13 12:21
#include <bits/stdc++.h>

using namespace std;

long long n, k;

void solve() {
	scanf("%lld%lld", &n, &k);
	if (!k) {
		printf("1\n");
		return;
	}
	long long l = 1, r = 1LL << 60;
	while (l + 1 < r) {
		long long m = (l + r) >> 1;
		if (n / m > k) l = m;
		else r = m;
	}
	long long L = r;
	l = 1, r = 1LL << 60;
	while (l + 1 < r) {
		long long m = (l + r) >> 1;
		if (n / m >= k) l = m;
		else r = m;
	}
	long long R = l;
	printf("%lld\n", R - L + 1);
}

int main() {
	int t;
	scanf("%d", &t);
	while (t--) solve();
	return 0;
}

解读:是一个二分查找的应用,用于找出满足特定条件的最小和最大整数。以下是代码的详细解释:

solve 函数首先读取两个整数 n 和 k。如果 k 为 0,则直接输出 1 并返回,因为任何数除以 0 都是未定义的。 如果 k 不为 0,则使用二分查找算法来找到最小的 m,使得 n / m > k。这里 l 和 r 分别表示搜索范围的左边界和右边界,初始值分别为 1 和 2^60。在每次迭代中,计算中间值 m,如果 n / m 大于 k,则更新左边界 l 为 m,否则更新右边界 r 为 m。当 l + 1 >= r 时,循环结束,此时 r 就是满足条件的最小整数。 接下来,再次使用二分查找算法来找到最大的 m,使得 n / m >= k。这里的逻辑与之前类似,但是条件变成了 >= 而不是 >。当 l + 1 >= r 时,循环结束,此时 l 就是满足条件的最大整数。 最后,计算并输出满足条件的整数个数,即 R - L + 1。 在 main 函数中,读取测试用例的数量 t,然后循环调用 solve 函数 t 次。

通过二分查找算法高效地找到了满足特定条件的整数范围,并输出了这个范围内的整数个数。

2024/10/13 12:21
加载中...