题解-余数相同问题

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;
}

小结
这题的关键是把“余数相同”转换为“差值可被整除”,用到数学中同余、最大公约数、公因数的知识。这类题目是数论中的经典应用题,理解后可以拓展到更多类似问题。

posted @ 2025-07-19 10:26  stephen_zuo  阅读(69)  评论(0)    收藏  举报