整个8月份,都忙着找实习。直接今天入职第二天,才借着午休时间,重拾博客。
扩展欧几里德基础题,【请点击蓝色字体,查看算法详情】
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
/**
* 题意:已知 a,b,c,d,求解 b+ax = d+cy 中 x 的最小正整数解。
*
* @author TinyDolphin
*
*/
public class Main {
private static int gcd(int a, int b) {
return b == 0 ? a : gcd(a, a % b);
}
private static int x;
private static int y;
public static int exGcd(int a, int b) {
if (b == 0) {
x = 1;
y = 0;
return a;
} else {
int d = exGcd(b, a % b);
int temp = x;
x = y;
y = temp - a / b * y;
return d;
}
}
public static void main(String[] args) throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
int a;
int b;
int c;
int d;
while (in.nextToken() != StreamTokenizer.TT_EOF) {
a = (int) in.nval;
in.nextToken();
b = (int) in.nval;
in.nextToken();
c = (int) in.nval;
in.nextToken();
d = (int) in.nval;
// b+ax = d+cy --> ax-cy = d-b 此处只求 x 即可,所以可以简化成 ax + cy = d-b
int gcd = exGcd(a, c); // 利用扩展欧几里德,求 ax + cy = gcd(a,c)
if ((d - b) % gcd == 0) {
x = x * (d - b) / gcd; // 利用结论二,求 ax + cy = d-b
int T = c / gcd; // 利用结论一,求 x 的最小正整数解
x = (x % T + T) % T;
out.println(x * a + b);
} else {
out.println(-1);
}
}
out.flush();
}
}