注意事项
涉及对extend_gcd的运用,可以看我之前的文章:java—扩展欧几里得算法(extend gcd)
题目
给定 n 组数据 ai,bi,mi,对于每组数求出一个 xi,使其满足 ai×xi≡bi(modmi),如果无解则输出 impossible
第一行包含整数 n
接下来 n 行,每行包含一组数据 ai,bi,mi
输出共 n 行,每组数据输出一个整数表示一个满足条件的 xi,如果无解则输出 impossible
每组数据结果占一行,结果可能不唯一,输出任意一个满足条件的结果均可
输出答案必须在 int 范围之内
输入:
2
2 3 6
4 3 5
输出:
impossible
-3
public class 扩展欧几里得算法_线性同余方程 {
public static int x, y;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
while (n-- > 0) {
int a = in.nextInt(), b = in.nextInt(), m = in.nextInt();
int d = ex_gcd(a, m);
//区别主要在这里,推导过程就是ax-b=my = ax+my'=b, 然后gcd(a,m) = ax0+my0 = d, 可以得知d一定是b的除数/整数因子
//如果b%d成立,那么就根据d推算x的结果,x = x0 * b/d % m, %m主要是防止int溢出
//如果b%d不成立,就输出impossible即可
if (b % d == 0) System.out.println((long) x * b/d % m);
else System.out.println("impossible");
}
}
//这里还是extend_gcd的写法不变![请添加图片描述](https://img-blog.csdnimg.cn/913d2efa9a0d4ac5b0997487558b0de8.jpeg)
public static int ex_gcd(int a, int b) {
if (b == 0) {
x = 1; y = 0; return a;
}
int d = ex_gcd(b, a%b);
int temp = x;
x = y;
y = temp - a/b * y;
return d;
}
}
具体推导过程:
声明:算法思路来源为y总,详细请见https://www.acwing.com/
本文仅用作学习记录和交流