中国剩余定理

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

 

上一篇:Educational Codeforces Round 52 (Rated for Div. 2)


下一篇:BZOJ-1143 [CTSC2008]祭祀