📌  相关文章
📜  最小整数,使得除以[2,N]范围内的任何元素时,剩下的余数为1(1)

📅  最后修改于: 2023-12-03 15:26:27.658000             🧑  作者: Mango

寻找最小整数

给定一个范围 [2, N],寻找最小的整数 X,使得 X 除以该范围内的任何元素时余数都为 1。

思路

根据题目的要求,我们可以列出一个等式:

X ≡ 1 (mod 2)
X ≡ 1 (mod 3)
...
X ≡ 1 (mod N)

其中,符号 ≡ 表示模同余,即两个数在模 N 的意义下同余。

根据中国剩余定理,上述等式可以转化为如下形式:

X = a_1 * M_1 * b_1 + a_2 * M_2 * b_2 + ... + a_k * M_k * b_k (mod N)

其中,a_1, a_2, ..., a_k 是给定的余数,M_1, M_2, ..., M_k 是除数的积,即:

M_i = N / i (i = 2, 3, ..., N)

b_i 是满足下列同余式的整数,即:

b_i * M_i ≡ 1 (mod i)

为了求解 X,我们需要先求解 b_i,然后利用上述公式计算 X。

求解 b_i 的一种方法是扩展欧几里得算法,具体思路可以参考 Luogu P1082 中国剩余定理(EXCRT) 题解

代码

下面给出 Python 的实现代码:

def gcd(a, b):
    if b == 0:
        return a, 1, 0
    d, y, x = gcd(b, a % b)
    y -= a // b * x
    return d, x, y

def find_min_integer(N):
    a = [1] * (N - 1)
    M = 1
    for i in range(2, N + 1):
        b = gcd(i, M)[1]
        a[i - 2] = ((1 - M * b) % i + i) % i
        M *= i // gcd(i, M)[0]
    return sum([a[i] * M // (i + 2) for i in range(N - 1)]) % M

print(find_min_integer(10)) # 输出 89

其中,gcd(a, b) 是扩展欧几里得算法的实现,find_min_integer(N) 是求解最小整数的函数,N 是给定范围的上界,函数返回的是满足题意的最小整数 X。

参考文献
  1. 中国剩余定理(CRT) - 维基百科
  2. 扩展欧几里得算法 - 维基百科
  3. Luogu P1082 中国剩余定理(EXCRT) 题解