zl程序教程

您现在的位置是:首页 >  后端

当前栏目

877. 扩展欧几里得算法

扩展算法 欧几里得
2023-09-27 14:27:32 时间

Powered by:NEFU AB-IN

Link

877. 扩展欧几里得算法

  • 题意

    给定 n 对正整数 ai,bi,对于每对数,求出一组 xi,yi,使其满足 ai×xi+bi×yi=gcd(ai,bi)。

  • 思路

    • b = = 0 b == 0 b==0
      a x + 0 = g c d ( a , 0 ) ax + 0 = gcd(a, 0) ax+0=gcd(a,0)
      所以 x = 1 , y = 0 x = 1, y = 0 x=1,y=0

    • b ! = 0 b != 0 b!=0
      a x 1 + b y 1 = g c d ( a , b ) ax1+by1=gcd(a,b) ax1+by1=gcd(a,b), b x 2 + ( a % b ) y 2 = g c d ( b , a % b ) bx2+(a\%b)y2=gcd(b,a\%b) bx2+(a%b)y2=gcd(b,a%b)
      g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\%b) gcd(a,b)=gcd(b,a%b),可得:
      a x 1 + b y 1 = b x 2 + ( a % b ) y 2 ax1+by1=bx2+(a\%b)y2 ax1+by1=bx2+(a%b)y2
      即: a x 1 + b y 1 = b x 2 + ( a − ( a / b ) ∗ b ) y 2 ax1+by1=bx2+(a-(a/b)*b)y2 ax1+by1=bx2+(a(a/b)b)y2
      = a y 2 + b x 2 − ( a / b ) ∗ b y 2 ; =ay2+bx2-(a/b)*by2; =ay2+bx2(a/b)by2;
      即: a x 1 + b y 1 = a y 2 + b ( x 2 − ( a / b ) ∗ y 2 ) ax1+by1=ay2 + b(x2-(a/b)*y2) ax1+by1=ay2+b(x2(a/b)y2)
      根据恒等定理,对应项相等,得: x 1 = y 2 ; y 1 = x 2 − ( a / b ) ∗ y 2 x1=y2; y1=x2-(a/b)*y2 x1=y2;y1=x2(a/b)y2
      这样我们就得到了: x 1 x1 x1 y 1 y1 y1的值基于 x 2 x2 x2 y 2 y2 y2,所以我们可以通过递归求解。

  • 代码

    def exgcd(a, b):
        global x, y
        if b == 0:
            x, y = 1, 0
            return a
        
        d = exgcd(b, a % b)
        x, y = y, x
        y -= (a // b) * x
        return d
    
    for _ in range(int(input())):
        a, b = map(int, input().split())
        x, y = 0, 0
        exgcd(a, b)
        print(x, y)