877. 扩展欧几里得算法
Powered by:NEFU AB-IN
文章目录
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)
相关文章
- 扩展kmp算法
- 【EKF定位】基于传感器信息融合的EKF扩展卡尔曼滤波定位算法matlab仿真
- C#,最长公共扩展(LCE,Longest Common Extention)的算法与源代码
- 使用Docker、CoreOS、Mesos部署可扩展的Web应用
- ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01653: 表 SYS.AUD$ 无法通过 8192 (在表空间 SYSTEM 中) 扩展
- 【SpringBoot】SpringBoot启动流程图和扩展点说明
- POJ 1061 青蛙的约会(扩展欧几里德算法)
- Redis PHP扩展安装步骤
- 如何在Centos7安装swoole的PHP扩展
- 扩展thinkphp5的redis类方法
- [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展trim,trimLeft,trimRight方法(2)
- Spark RDD API扩展开发
- 安装 rbbitMQ redis mongo的三个扩展
- 【监控笔记】【2.1】扩展事件
- 【Unity】编辑器扩展-04-拓展Scene视图