一下是二分答案的程序(配有详细注释,写的比较匆忙,可能有误)
```
#include <bits/stdc++.h>
using namespace std;
typedef long long LL; // 使用LL代替long long,方便书写
int main()
{
int T; // 询问次数
scanf("%d", &T);
while (T--) // 处理每个询问
{
int X, a, b;
scanf("%d%d%d", &X, &a, &b); // 读入X, a, b
// 计算起始的k值,满足k*X >= a
LL start_k;
if (a % X == 0)
{
start_k = a / X; // 如果a是X的倍数,直接取商
}
else
{
// 如果a是正数且不是X的倍数,需要向上取整
if (a > 0)
{
start_k = a / X + 1;
}
else
{
// 如果a是负数,除法会自动向下取整,结果已经是满足k*X >= a的最小值
start_k = a / X;
}
}
// 调整start_k,确保不是100的倍数(因为100倍数的数不算X数)
LL adj_k = start_k; // adj_k表示调整后的起始k值
if (adj_k % 100 == 0)
{
adj_k++; // 如果起始k是100的倍数,跳过它
}
// 二分查找:寻找第b个有效的k值(即不是100的倍数)
LL left = adj_k;
// 左边界
LL right = adj_k + 1LL * b * 100; // 右边界(足够大)
while (left < right)
{
LL mid = (left + right) / 2; // 中间值
// 计算[left, mid]区间内的有效k的数量
// 总共有 (mid - adj_k + 1) 个数
// 减去其中是100的倍数的数的个数
LL total = mid - adj_k + 1; // 区间内总共有多少个数
LL invalid = (mid / 100) - ((adj_k - 1) / 100); // 区间内是100的倍数的数的个数
LL cnt = total - invalid; // 有效数的数量
if (cnt < b)
{
// 如果有效数不够,需要扩大右边界
left = mid + 1;
}
else
{
// 否则缩小右边界
right = mid;
}
}
// 最终结果就是left对应的数(left是满足条件的第b小的k值)
LL ans = left * X;
printf("%lld\n", ans);
}
}