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;
}
posted @ 2022-01-26 16:50  Shunpower  阅读(423)  评论(0编辑  收藏  举报