余数相同问题

GitHub跳转原题关系图返回列表

三个数除以 x 余数相同 ⇔ x 整除任意两数之差,答案即 gcd 的最小大于 1 的因子。

OJ: roj

题目 ID: 1080

难度:入门

标签:数学数论gcdc++

创建: 2026-09-29 17:43

更新: 2026-10-05 00:28

题目描述

已知三个正整数 a, b, c,求最小的大于 1 的整数 x,使得 a, b, c 分别除以 x 所得余数相同。数据保证有解。

思路

同余意味着 x 整除任意两数之差,因此 x 必须整除 gcd(a-b, b-c)。当 a=b=c 时答案为 2;否则答案是该 gcd 的最小大于 1 的因子,直接枚举到 √g 即可。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 17:43
# update_at: 2026-09-29 17:48

import sys
from math import gcd


def solve() -> None:
    a, b, c = map(int, sys.stdin.buffer.read().split())

    # 同余条件 a%x == b%x == c%x ⇔ x 同时整除两个差 a-b 与 b-c
    diff_ab = a - b  # 题面的 a-b,等于 0 时对约束无贡献
    diff_bc = b - c  # 题面的 b-c,同理
    g = gcd(diff_ab, diff_bc) or 2  # 所有可行 x 的公约束;a=b=c 时为 0,任何 x>1 都可行,答案 2

    x = next(i for i in range(2, g + 1) if g % i == 0)  # g 的最小大于 1 的因子

    print(x)


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-05 00:27
 * update_at: 2026-10-05 00:27
 */
#include <iostream>
#include <numeric>
using namespace std;

typedef long long ll;

ll a, b, c;

// 求 x 的最小大于 1 的因子
ll min_factor(ll x) {
    for (ll i = 2; i * i <= x; ++i)
        if (x % i == 0) return i;
    return x; // x 本身是素数
}

int main() {
    cin >> a >> b >> c;
    ll g = gcd(a - b, b - c); // C++17 gcd 返回非负
    if (g == 0) {             // a == b == c 时任意 x > 1 都合法
        cout << 2 << endl;
        return 0;
    }
    cout << min_factor(g) << endl;
    return 0;
}