Loading

中国剩余定理模板

 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 }

 

posted @ 2016-08-15 22:14  Shadowdsp  阅读(315)  评论(0编辑  收藏  举报