个人小理解
求a≡bmol(l)
ax + ly = b
ax + ly = gcd(a,l)
这时就可以用拓展欧几里得求
ex_gcd(a,l);
求出一组解(x0,y0);
通解:
X = x0 + t*(l/gcd(a,l));
Y = y0 - t*(a/gcd(a,l));
原方程解:
X = x0*b/gcd(a,l);
Y = y0*b/gcd(a,l);
例题:poj1061
链接:点击打开链接
模板题 代码如下:
import java.util.Scanner;
public class Main {
public static long[] ec_gcd(long a, long b) {//java版拓展欧几里得模板
long ans;
long result[] = new long[3];
if (b == 0) {
result[0] = a;
result[1] = 1;
result[2] = 0;
return result;
}
long temp[] = ec_gcd(b, a % b);
ans = temp[0];
result[0] = ans;
result[1] = temp[2];
result[2] = temp[1] - (a / b) * temp[2];
return result;
}
@SuppressWarnings("resource")
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
long x = scanner.nextLong();
long y = scanner.nextLong();
long m = scanner.nextLong();
long n = scanner.nextLong();
long l = scanner.nextLong();
long a = m - n;
long b = l;
long c = y - x;
if (a < 0) {
a = -a;
c = -c;
}
long[] result = new long[3];
result = ec_gcd(a, l);
if (c % result[0] != 0 || (m == n && x != y)) {
System.out.println("Impossible");
} else {
b = b / result[0];
c = c / result[0];
result[1] = c * result[1];//求原方程的x解,数有可能求得不是想要的那个解
System.out.println((result[1] % b + b) % b);//我们把它取模就好
}
}
}
}