扩展中国剩余定理
扩展中国剩余定理
模板:
#define int long long
int n, m[100010], a[100010];
bool res = 1;
void mul(int &a, int b, int c){
int ret = 0;
if (b < 0)b = -b, a = -a;
for (; b; b >>= 1, a = (a + a) % c)
if (b & 1)ret = (ret + a) % c;
a = ret;
}
int _exgcd(int a, int b, int &x, int &y){
if (b == 0){x = 1, y = 0;return a;}
int r = _exgcd(b, a % b, x, y);y = x - a / b * (x = y);return r;
}
int exgcd(int a, int b, int c, int &x){int y, t = _exgcd(a, b, x, y);mul(x, c / t, b / t);return t;}
void un(int a1, int a2, int m1, int m2, int &A, int &M){
int k1, t = exgcd(m1, m2, a1 - a2, k1);
M = m1 / t * m2;A = (a1 % M - k1 * m1 % M + M) % M;
}
int excrt(){
int A = a[1], M = m[1];
for (int i = 2; i <= n; ++i)un(A, a[i], M, m[i], A, M);
return A;
}
参考
- \(\text{12.11 math1.pdf \; \;by Tx\_Lcy}\)

浙公网安备 33010602011771号