冬天就快来了,n 只鼠鼠偷了一大堆奶酪放到老鼠洞里,约定第二天平分。这些鼠鼠很崇拜鼠王杰瑞,所以都想给它留一些奶酪。可没过一会,第一只鼠鼠悄悄来到老鼠洞里,把奶酪平均分成 n 份,把剩下的 m 个奶酪吃了,然后藏起来一份,最后把剩下的奶酪重新合在一起。又过了一会,这些鼠鼠依次悄悄来到山洞,都做同样的操作,恰好每次都剩下了 m 个奶酪。第二天,这些鼠鼠来到老鼠洞,把剩下的鼠鼠分成 n 分,巧了,还是剩下了 m 个。问,原来这些鼠鼠至少偷了多少个奶酪。 如何用c语言写
时间: 2023-11-09 17:05:32 浏览: 683
简练的c语言学习,肯定能帮你忙!找了好久才找到!都是以前用过的!
以下是用 C 语言实现的代码:
```c
#include <stdio.h>
int gcd(int a, int b) { // 求最大公约数
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}
int main() {
int n, m, x, y;
scanf("%d%d", &n, &m);
x = m;
y = n;
for (int i = 2; i <= n; i++) {
x = (x + m) % i;
if (x == 0) {
x = i;
}
y = y / gcd(y, i - 1) * (i - 1); // 求最小公倍数
}
printf("%d\n", y + x); // 输出结果
return 0;
}
```
代码思路:
首先,根据题意,我们可以列出如下的方程:
$$\begin{cases} \frac{am}{n}=\frac{m}{n}-1 \\ \frac{bm}{n-1}=\frac{am-m}{n}=\frac{(a-1)m}{n} \end{cases}$$
其中,$a$ 表示第一只老鼠吃了几分之一的奶酪,$b$ 表示第二只老鼠吃了几分之一的奶酪。
由于题目要求最后剩余的奶酪数目为 $m$,所以我们可以得到以下式子:
$$\frac{bm}{n-1}=\frac{(a-1)m}{n}=m-k$$
其中,$k$ 表示剩余的奶酪数目。
化简可得:
$$\frac{b}{n-1}=\frac{a-1}{n}=\frac{1}{m-k}$$
接下来,我们可以用反演法来求解 $a$ 和 $b$。
设 $x$ 为最后一只老鼠分配奶酪的份数,则:
$$x \equiv k \pmod{n}$$
即:
$$x = kn + r$$
其中,$r$ 表示余数,$0 \leq r < n$。
由于第二只老鼠分配奶酪后,剩下的奶酪数目为 $m$,所以:
$$\frac{bm}{n-1}=x-m$$
代入上式,得到:
$$\frac{bm}{n-1}=kn+r-2m$$
由于 $\gcd(m, n-1)=1$,所以可以将上式转化为:
$$\frac{b}{n-1}=\frac{kn+r-2m}{m(n-1)}$$
同理,根据 $\frac{a-1}{n}=\frac{1}{m-k}$ 可得:
$$\frac{a-1}{n}=\frac{kn+n-r-2m}{(m-k)n}$$
将 $x=kn+r$ 代入上式,得到:
$$\frac{a-1}{n}=\frac{x+n-2m-kn}{(m-k)n}$$
化简可得:
$$\frac{a-1}{n}=\frac{x-2m}{(m-k)n}-\frac{k}{m-k}$$
设 $p=\frac{a-1}{n}$,$q=\frac{b}{n-1}$,则:
$$p=\frac{x-2m}{(m-k)n}-\frac{k}{m-k}$$
$$q=\frac{x-2m}{m(n-1)}$$
根据裴蜀定理,方程 $px+qy=1$ 有整数解,则 $p$ 和 $q$ 的最小公倍数就是答案。
最后,输出最小公倍数加上第一只老鼠分配奶酪的份数,即为最终答案。
时间复杂度:$O(n \log n)$。
阅读全文