题意简述
给定 t ( 1 ≤ t ≤ 1 0 4 ) t(1 \le t \le 10^4) t(1≤t≤104) 组 l , r ( 1 ≤ l , r ≤ 1 0 9 ) l,r(1 \le l,r \le 10^9) l,r(1≤l,r≤109)。请求出 a m o d b ( l ≤ a , b ≤ r ) a \mod b(l \le a,b \le r) amodb(l≤a,b≤r) 的最大值。
思路
我们考虑每一次处理:
如题目所说,我们要求模数最大,一定是 b − 1 b-1 b−1。所以 a = r a=r a=r 时, b b b 也能更大。
简单思考一下就可以发现:当 b = a 2 + 1 b=\frac{a}{2}+1 b=2a+1时,答案可以取到最大值 a 2 − 1 \frac{a}{2} -1 2a−1。
但是,题目里有个条件: l ≤ b l \le b l≤b,所以最小只能到 l l l。假如 l > a 2 + 1 l>\frac{a}{2}+1 l>2a+1,那么 b b b 只能取 l l l。所以 a = r , b = max { l a 2 + 1 a=r,b=\max{\begin{cases}l\\\frac{a}{2}+1\end{cases}} a=r,b=max{l2a+1。
没什么好说的了,上代码。
code
#include <bits/stdc++.h>
using namespace std;
int t, l, r;
int main() {
cin >> t;
while (t--) {
cin >> l >> r;
cout << r % max(r / 2 + 1, l) << '\n';
}
return 0;
}