信息学奥赛一本通 2074:【21CSPJ普及组】分糖果(candy) | 洛谷 P7909 [CSP-J 2021] 分糖果

【题目链接】

ybt 2074:【21CSPJ普及组】分糖果(candy)
洛谷 P7909 [CSP-J 2021] 分糖果

【题目考点】

1. 数学

取模运算

【解题思路】

只要篮子中有大于等于n颗糖,就要分走n颗糖。最后剩下的归自己的糖的数量一定小于n。这似乎是在做取模运算。
取糖果最少l个,最多r个,这是个连续整数构成的区间。
我们先考察一个连续整数构成的区间的内整数对n取模的结果的规律(即除以n的余数)

整数x 0 1 n-1 n n+1 2n-1 2n
x%n 0 1 n-1 0 1 n-1 0

m是某个正整数

整数x mn mn+1 mn+n-1 (m+1)n (m+1)n+1 (m+1)n+n-1 (m+2)n
x%n 0 1 n-1 0 1 n-1 0

可以看到,x%n的值始终是从0变到n-1,再从0变到n-1。
下图横轴为x,纵轴为x%n,n为6时的示例情况
信息学奥赛一本通 2074:【21CSPJ普及组】分糖果(candy) | 洛谷 P7909 [CSP-J 2021] 分糖果_第1张图片

其中,x%n的值每“段”从0变到n-1,都满足x/n的值是不变的。

比如x从 m ⋅ n m\cdot n mn变化到 m ⋅ n + n − 1 m\cdot n+n-1 mn+n1,x/n的值始终是m,而x%n的值从0变化到n-1

  • 如果给定的l与r整除n的值是相同的,即l/n == r/n,那么说明l与r在同一“段”中,x是这一段中的数字。根据上述规律,x从l变化到r的过程中,x%n的值是逐渐增大的,当x为r时,x%n的值最大,为r%n
    下图横轴为x,纵轴为x%n,L,R为满足该描述的一种可能的情况
    信息学奥赛一本通 2074:【21CSPJ普及组】分糖果(candy) | 洛谷 P7909 [CSP-J 2021] 分糖果_第2张图片

  • 如果给定的l与r整除n的值是不同的,即l/n != r/n,那么从l到r范围内一定存在一个数字x%n为n-1,一定存在一个数字x%n为0。n-1就是l到r范围内的数字对n取模能得到的最大值。
    下图横轴为x,纵轴为x%n,L,R为满足该描述的一种可能的情况信息学奥赛一本通 2074:【21CSPJ普及组】分糖果(candy) | 洛谷 P7909 [CSP-J 2021] 分糖果_第3张图片

【题解代码】

解法1:
#include
using namespace std;
int main()
{
	int n, l, r;
	cin >> n >> l >> r;
	if(l/n == r/n)
		cout << r%n;
	else
		cout << n-1;
	return 0;
}

你可能感兴趣的:(NOIP真题解答,信息学奥赛一本通题解,洛谷题解,CSP真题)