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 }
时间: 2024-12-08 17:55:26