裴蜀定理
扩展欧几里得算法
时间复杂度O(logn)
求解裴蜀定理中x
和y
以及(a, b)
的过程就是扩展欧几里得算法
例题
给定 n 对正整数 ai,bi,对于每对数,求出一组 xi,yi,使其满足 ai×xi+bi×yi=gcd(ai,bi)。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含两个整数 ai,bi。
输出格式
输出共 n 行,对于每组 ai,bi,求出一组满足条件的 xi,yi,每组结果占一行。
本题答案不唯一,输出任意满足条件的 xi,yi均可。
数据范围
1≤n≤105
1≤ai,bi≤2×109
输入样例:
2
4 6
8 18
输出样例:
-1 1
-2 1
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
while (n-- > 0) {
int a = sc.nextInt(), b = sc.nextInt();
int[] x = new int[1], y = new int[1];
exgcd(a, b, x, y);
System.out.println(x[0] + " " + y[0]);
}
}
static int exgcd(int a, int b, int[] x, int[] y) {
if (b == 0) {
x[0] = 1;
y[0] = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y[0] -= a / b * x[0];
return d;
}
}
如何用扩展欧几里得算法求逆元?
例如给定a
和b
求a
关于模b
的乘法逆元。
答:直接用扩欧函数 int d = exgcd(a, b, x, y)
如果 d != 1
说明a
和b
不互质,乘法逆元不存在
如果 d == 1
说明a
关于模b
的乘法逆元存在,x
就是a
关于模b
的乘法逆元
当然x
只是某一个特解,范围不一定符合要求,将其转换为 [0, b)
范围中的解x = (x + b) % b
特别注意:溢出处理