"""
https://www.lanqiao.cn/problems/393/learning/?page=1&first_category_id=1&problem_id=393
"""
# 先求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)
# m必须是gcd(a, b)的倍数才有解
if m % g != 0:
return None, None, None
x0, y0 = x1 * m // g, y1 * m // g
return g, x0, y0
# 求a在模n意义下的逆元x, 即ax ≡ 1(mod n)
# 也就是求ax + by = m(b=n, m=1)的一组解
def Inv(a, n):
g, x, y = Func(a, n, 1)
if x is None:
return None
else:
return x % n
a, b = map(int, input().split())
print(Inv(a, b))
蓝桥杯-同余方程
最新推荐文章于 2024-07-18 19:36:20 发布
本文介绍了如何使用Python实现扩展欧几里得算法(exgcd)来解决ax+by=gcd(a,b)的线性同余方程,并进一步探讨如何找到满足ax+by=m的解,特别是当m=1时,即求a在模b下的逆元。函数`Inv`用于求a在模n下的逆元,如果存在则返回结果,否则返回None。
摘要由CSDN通过智能技术生成