题解-余数相同问题
https://ac.xiaosaima.com/d/CD01_2404/p/370?tid=684d6adc1f050c39f92cb8df
题目描述
已知三个正整数a,b,c。现有一个大于1的整数x,将其作为除数分别除a,b,c,得到的余数相同。
请问满足上述条件的x的最小值是多少?数据保证x有解。
输入格式
一行,三个不大于1000000的正整数a,b,c,两个整数之间用一个空格隔开。
输出格式
一个整数,即满足条件的x的最小值。
样例
输入样例
300 262 205
输出样例
19
💡 解题思路(暴力枚举)
我们要求:
[ a % x = b % x = c % x ]
直接暴力尝试所有 ( x )(从 ( 2 ) 到 ( 1000000 )):
- 遍历每个可能的 ( x );
- 对 ( a, b, c ) 分别取模;
- 如果三个余数相等,则输出当前的 ( x ) 即可。
🧾 C++ 代码(暴力法)
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
for (int x = 2; x <= 1000000; ++x) {
int r1 = a % x;
int r2 = b % x;
int r3 = c % x;
if (r1 == r2 && r2 == r3) {
cout << x << endl;
break;
}
}
return 0;
}
📈 复杂度分析
时间复杂度:$O(n)$,最坏情况下要尝试到 $n=10^6$
空间复杂度:$O(1)$,只用常数变量
🧠 学习目标
理解模运算的基本性质;
熟悉暴力枚举的应用;
为数论优化方法(如最大公约数)打基础。
如需更优方法(gcd求公因数),可参考进阶解法版本。
寻找满足条件的最小整数 x
题目理解
有三个正整数 a, b, c。我们要找一个大于1的整数 x,使得:
- a % x == b % x == c % x,即三个数除以 x 后的余数相同。
目标是: - 找到最小的满足条件的 x(x > 1)
数学原理分析
我们设这共同的余数为 r,那么:
a ≡ r (mod x)
b ≡ r (mod x)
c ≡ r (mod x)
换句话说:
a - r ≡ b - r ≡ c - r ≡ 0 (mod x)
即:
a - b ≡ 0 (mod x)
b - c ≡ 0 (mod x)
a - c ≡ 0 (mod x)
也就是说:
x 是 (a - b)、(b - c)、(a - c) 的公约数。
转换为数学问题
我们只需要找到 (a - b)、(b - c)、(a - c) 的最大公约数的所有因数(大于1),然后输出最小的那个因数。
例如:
a = 300
b = 262
c = 205
计算差值:
r
|a - b| = 38
|b - c| = 57
|a - c| = 95
这三个数的最大公约数是:
gcd(38, 57, 95) = 19
所以 x 应该是 19 的因数,且大于1,最小的就是 19。
解题思路总结
计算 abs(a - b),abs(b - c),abs(a - c)
求这三个数的最大公约数 g
从 2 到 g 遍历,找第一个可以整除 g 的数
输出这个数(也可以直接输出 g,因为是最小满足条件的 x)
以下是整理为 Markdown 格式的文本:
markdown
复制
寻找满足条件的最小整数 x
题目理解
有三个正整数 a, b, c。我们要找一个大于1的整数 x,使得:
- a % x == b % x == c % x,即三个数除以 x 后的余数相同。
目标是: - 找到最小的满足条件的 x(x > 1)
数学原理分析
我们设这共同的余数为 r,那么:
a ≡ r (mod x)
b ≡ r (mod x)
c ≡ r (mod x)
换句话说:
css
复制
a - r ≡ b - r ≡ c - r ≡ 0 (mod x)
即:
css
复制
a - b ≡ 0 (mod x)
b - c ≡ 0 (mod x)
a - c ≡ 0 (mod x)
也就是说:
x 是 (a - b)、(b - c)、(a - c) 的公约数。
转换为数学问题
我们只需要找到 (a - b)、(b - c)、(a - c) 的最大公约数的所有因数(大于1),然后输出最小的那个因数。
例如:
Text
复制
a = 300
b = 262
c = 205
计算差值:
r
复制
|a - b| = 38
|b - c| = 57
|a - c| = 95
这三个数的最大公约数是:
matlab
复制
gcd(38, 57, 95) = 19
所以 x 应该是 19 的因数,且大于1,最小的就是 19。
解题思路总结
计算 abs(a - b),abs(b - c),abs(a - c)
求这三个数的最大公约数 g
从 2 到 g 遍历,找第一个可以整除 g 的数
输出这个数(也可以直接输出 g,因为是最小满足条件的 x)
C++代码实现
```cpp
#include <iostream>
#include <algorithm> // for gcd
using namespace std;
// 扩展支持三个数的gcd
int gcd3(int a, int b, int c) {
return __gcd(a, __gcd(b, c));
}
int main() {
int a, b, c;
cin >> a >> b >> c;
int d1 = abs(a - b);
int d2 = abs(b - c);
int d3 = abs(a - c);
int g = gcd3(d1, d2, d3);
// 找 g 的最小因数(大于1)
for (int i = 2; i <= g; ++i) {
if (g % i == 0) {
cout << i << endl;
return 0;
}
}
return 0;
}
小结
这题的关键是把“余数相同”转换为“差值可被整除”,用到数学中同余、最大公约数、公因数的知识。这类题目是数论中的经典应用题,理解后可以拓展到更多类似问题。

浙公网安备 33010602011771号