📅  最后修改于: 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。