P7909 [CSP-J 2021] 分糖果 题解
考场上唯一 A 的题,T3 因为没写返回值造成的差异爆掉了。
题意简述
在开区间 \((l,r)\) 取一个数 \(x\) 使得 \(x\bmod n\) 的最大。
思路
很容易想到暴力,把 \(l\) 到 \(r\) 全扫一遍就行,得分 \(70\)。
但是可以发现,在 \((l,r)\) 这一段里,只有两种情况:
- 包含一个 \(x\) 使得 \(n\) 可以整除 \(x\)。
- 如果不包含那么 \(r\) 一定是最大的,因为 \((l,r)\) 中若没有 \(x|n\) 那么这一段中每一个数 \(\bmod n\) 的值一定递增并在 \(r\) 处达到段内的顶峰。
所以我们可以检查 \(l+(n-l\bmod n-1)\) 的值(即使得 \(\bmod n=n-1\) 最小的 \(x\))是否在区间内,如果是可以直接输出 \(n-1\),否则输出 \(r\bmod n\)。
AC 代码
#include <bits/stdc++.h>
using namespace std;
int n,l,r;
int main(){
cin>>n>>l>>r;
int k=l%n;
if(l+(n-1-k)<=r){
cout<<n-1<<endl;//情况1
}
else{
cout<<r%n<<endl;//情况2
}
return 0;
}