1 /*
2 同余方程组 :
3 设正整数m1.m2.mk两两互素,则方程组
4 x ≡ a1 (mod m1)
5 x ≡ a2 (mod m2)
6 x ≡ a3 (mod m3)
7 .
8 .
9 x ≡ ak (mod mk)
10 有整数解,
11 解为 x ≡ (a1 * M1 * 1/M1 + a2 * M2 * 1/M2 + a3 * M3 * 1/M3 + …… +ak * Mk * 1/Mk) mod M
12 其中 M = M1 * M2 * M3 * …… * Mk, Mi为M/mi, 1/Mi为Mi的逆元
13 */
14
15 void exgcd(int a, int b, int &x, int &y)
16 {
17 if(b == 0) {
18 x = 1;
19 y = 0;
20 return a;
21 }
22 exgcd(b, a % b, x, y);
23 int t = x;
24 x = y;
25 y = t - a / b * y;
26 return r;
27 }
28
29 LL CRT(int m[], int a[], int n) // m 是 mod 的数, a 是余数, n 是方程组组数
30 {
31 LL M = 1, ans = 0;
32 for(int i = 0; i < n; i++)
33 M *= m[i];
34 for(int i = 0; i < n; i++) {
35 int x, y;
36 LL Mi = M / m[i];
37 exgcd(Mi, m[i], x, y); //求出的 x 即 Mi 的逆元
38 ans = (ans + Mi * a[i] * x % M + M) % M;
39 }
40 return ans;
41 }