题意
这个程序主要解决的是在给定的区间 [L, R] 里,找出一个数 x,使得 x % n 的值最大。下面为你详细解析其核心逻辑:
解析
变量与输入环节: 程序会读取三个长整型数值,分别是 n、L 和 R。这里的 n 代表模数,[L, R] 则是取值区间。 最大余数的理论值: 在整数除法里,余数的最大值是 n - 1。所以,程序首先把 max_possible 设定为 n - 1,以此作为可能出现的最大余数。 定位首个关键数: 程序要找出区间 [L, R] 中第一个满足 x % n == n - 1 的数 first。其计算方式为 L + (max_possible - L % n + n) % n,这种计算能确保 first 是大于或等于 L 且符合条件的最小数。 结果判定: 当 first 处于区间 [L, R] 内时,意味着存在余数为 n - 1 的情况,此时直接输出 n - 1。 若 first 超出了区间范围,也就是大于 R,那就返回区间右端点 R 对 n 取模的结果,这就是在该区间内能够得到的最大余数。 示例说明: 假设 n = 5,L = 7,R = 10。此时,最大余数理论值为 4。通过计算得出 first = 9(因为 9 % 5 == 4),而 9 在区间 [7, 10] 内,所以输出结果为 4。 要是 R = 8,那么 first = 9 超出了区间范围,此时就返回 R % n = 8 % 5 = 3。 该算法的时间复杂度为常数级别,即 O(1),能够高效地处理大范围的数据。
标程
#include <iostream>
using namespace std;
int main() {
long long n, L, R;
cin >> n >> L >> R;
// 计算可能的最大余数n-1是否在[L, R]范围内
long long max_possible = n - 1;
// 找到第一个大于等于L且模n等于n-1的数
long long first = L + (max_possible - L % n + n) % n;
if (first <= R) {
cout << max_possible << endl;
} else {
cout << R % n << endl;
}
return 0;
}
后记
该算法的时间复杂度为常数级别,即 O(1),能够高效地处理大范围的数据。(开心)