码迷,mamicode.com
首页 > 其他好文 > 详细

中国剩余定理模板

时间:2016-08-15 23:59:49      阅读:421      评论:0      收藏:0      [点我收藏+]

标签:

 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 }

 

中国剩余定理模板

标签:

原文地址:http://www.cnblogs.com/fightfordream/p/5774556.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!