P7909 [CSP-J 2021] 分糖果

0 前言

这道题是两年来我做过的代码量最少的一道普及组题目,考场上 10min10min 推出结果,100pts100pts 应该没问题。(三个样例都过了,你谷民间数据也没错)


1 简化题意

给定正整数 n,L,R(2≤n≤L≤R≤109)n,L,R(2≤n≤L≤R≤109),求 max⁡k∈[L,R]{k mod n}k∈[L,R]max​{kmodn}。


2 题目分析

拿到手,发现这是一道明显的幼儿园高质量小朋友求偶人类高质量女性数学结论题。

R−L≤109R−L≤109

明显 O(n)O(n) 的做法不可取,怎么办?

自然地想到分析 L,RL,R 与 nn 之间的倍数关系。(因为要使 k mod nkmodn 最大,就一定要找尽量大的小于 nn 的倍数的数)

记 l=⌊Ln⌋,r=⌊Rn⌋l=⌊nL​⌋,r=⌊nR​⌋,容易发现如果 l=rl=r 的话,[L,R][L,R] 里面从小到大所有数模 nn 的值是单调递增的,于是 k=Rk=R 时 k mod nkmodn 最大。

如果 l<rl<r,说明在 (L,R](L,R] 中有至少一个 nn 的倍数(记为 NN)。显然,当 k=N−1k=N−1 时,k mod nkmodn 最大,为 n−1n−1。

可以结合样例理解上述结论。


3 代码实现

#include<iostream>
#include<cstdio>
using namespace std;

int n,l,r;

int main(){
	cin>>n>>l>>r;
	if(l/n==r/n) cout<<r%n;
	else cout<<n-1;
	return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值