"""
题目来源:
https://www.lanqiao.cn/problems/2131/learning/?page=1&first_category_id=1&name=%E5%AF%BB%E6%89%BE%E6%95%B4%E6%95%B0
建议先看一下中国剩余定理: https://blog.csdn.net/weixin_60193316/article/details/137074042
"""
# ps[i]表示n模i下的余数
ps = {
2:1,
3:2,
5:4,
7:4,
11:0,
13:10,
17:0,
19:18,
23:15,
29:16,
31:27,
37:22,
41:1,
43:11,
47:5
}
# 先求ax + by = gcd(a, b)的一组解
# 返回gcd(a, b), x, y
def exgcd(a, b):
# 递归出口
if b == 0:
return a, 1, 0
g, x2, y2 = exgcd(b, a % b)
x1, y1 = y2, x2 - (a // b) * y2
return g, x1, y1
# 再求ax + by = m的一组解(当m=1是就是求a在模b意义下的逆元x)
def Func(a, b, m):
g, x1, y1 = exgcd(a, b)
x0, y0 = x1 * m // g, y1 * m // g
return x0 % b
# 除数的乘积
N = 1
for k in ps:
N *= k
sumXiBi = 0
for mi, bi in ps.items():
# 求n个由原同余方程组变化得来的新同余方程组的解xi
Mi = N // mi
# 求Mi模mi意义下的逆元
t = Func(Mi, mi, 1)
xi = Mi * t
sumXiBi += xi * bi
print(sumXiBi % N)
"""
官方题解: 暴力求解
"""
from math import gcd
#求数字a,b的最小公倍数
def lcm(a, b):
return a * b // gcd(a, b)
a=[0, 0,
1,2,1,4,5,4,1,2,9,0,5,10,
11,14,9,0,11,18,9,11,11,15,17,9,
23,20,25,16,29,27,25,11,17,4,29,22,
37,23,9,1,11,11,33,29,15,5,41,46]
x = 0
step = 1
for i in range(2, 50):
#暴力求解满足x % i = a[i]
while x % i != a[i]:
x += step
step = lcm(step, i)
print(x)