AcWing 204. 表达整数的奇怪方式(中国剩余定理)

题目
之前没学基础课之前曾经数学块多次死在中国剩余定理上,这次要恶补了。
求解线性同余方程组
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
百度百科的中国剩余定理比较好理解,同时直接给了结论。
中国剩余定理

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版权协议,转载请附上原文出处链接和本声明。