CF1562A The Miracle and the Sleeper 题解

题意简述

给定 t ( 1 ≤ t ≤ 1 0 4 ) t(1 \le t \le 10^4) t(1t104) l , r ( 1 ≤ l , r ≤ 1 0 9 ) l,r(1 \le l,r \le 10^9) l,r(1l,r109)。请求出 a m o d    b ( l ≤ a , b ≤ r ) a \mod b(l \le a,b \le r) amodb(la,br) 的最大值。

思路

我们考虑每一次处理:

如题目所说,我们要求模数最大,一定是 b − 1 b-1 b1。所以 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 2a1

但是,题目里有个条件: l ≤ b l \le b lb,所以最小只能到 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值