洛谷 B3925:[GESP202312 三级] 小猫分鱼 → nxt=(cur-x)/n*(n-1)
【题目来源】
【题目描述】
海滩上有一堆鱼,N 只小猫来分。第一只小猫把这堆鱼平均分为 N 份,多了 i<N 个,这只小猫把多的 i 个扔入海中,拿走了一份。第二只小猫接着把剩下的鱼平均分成 N 份,又多了 i 个,小猫同样把多的 i 个扔入海中,拿走了一份。第三、第四、……,第 N 只小猫仍是最终剩下的鱼分成 N 份,扔掉多了的 i 个,并拿走一份。
编写程序,输入小猫的数量 N 以及每次扔到海里的鱼的数量 i,输出海滩上最少的鱼数,使得每只小猫都可吃到鱼。
例如:两只小猫来分鱼 N=2,每次扔掉鱼的数量为 i=1,为了每只小猫都可吃到鱼,可令第二只小猫需要拿走 1 条鱼,则此时待分配的有 3 条鱼。第一只小猫待分配的鱼有 3×2+1=7 条。
【输入格式】
总共 2 行。第一行一个整数 N,第二行一个整数 i。
保证 0<N<10;i<N 。
【输出格式】
一行一个整数,表示满足要求的海滩上最少的鱼数。
【输入样例】
3
1
【输出样例】
25
【数据范围】
0<N<10;
i<N 。
【算法分析】
● 核心逻辑
首先,设定如下三个假设。
(1)第 k 只猫进行分配前的鱼数为 cur;
(2)第 k 只猫进行分配后,留给第 k+1 只猫的鱼数为 nxt;
(3)小猫总个数为 n,每次扔掉的鱼数为 x。
则,第 k 只猫留给第 k+1 只猫的鱼数为:nxt=(cur-x)/n*(n-1)。由于本文代码是“逆推”(从第 n 只猫到第 1 只猫),所以等价变换可得 cur=nxt/(n-1)*n+x。
● 为什么只有 1 只猫时输出 1 ?当 n=1 时,m 只能为 0(因 m < n 且为非负整数)。所以,1 只猫需至少拿 1 条鱼,分配前鱼数 = 1×1 + 0=1,是满足规则的最小值。
【算法代码】
【参考文献】

浙公网安备 33010602011771号