题目
之前没学基础课之前曾经数学块多次死在中国剩余定理上,这次要恶补了。
求解线性同余方程组


百度百科的中国剩余定理比较好理解,同时直接给了结论。
中国剩余定理
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw = new PrintWriter(System.out);
public static void main(String[] args) throws IOException {
String[] s = br.readLine().split(" ");
int n = Integer.parseInt(s[0]);
boolean flag = true;
s = br.readLine().split(" ");
long a1 = Long.parseLong(s[0]);
long m1 = Long.parseLong(s[1]);
for (int i = 0; i < n - 1; i++) {
s = br.readLine().split(" ");
long a2 = Long.parseLong(s[0]);
long m2 = Long.parseLong(s[1]);
long k1[] = new long[1];
long k2[] = new long[1];
long res = exgcd(a1, a2, k1, k2);
if ((m2 - m1) % res != 0) {
flag = false;
break;
}
k1[0] *= (m2 - m1) / res;
long t = a2 / res;
k1[0] = (k1[0] % t + t) % t;
m1 = a1 * k1[0] + m1;
a1 = Math.abs(a1 / res * a2);
}
if (flag) pw.println((m1 % a1 + a1) % a1);
else pw.println(-1);
pw.flush();
br.close();
}
public static long exgcd(long a, long b, long x[], long y[]) {
if (b == 0) {
x[0] = 1;
y[0] = 0;
return a;
}
long res = exgcd(b, a % b, y, x);
y[0] -= a / b * x[0];
return res;
}
}
版权声明:本文为qq_43515011原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。