扩展中国剩余定理

扩展中国剩余定理

模板题:P4777 【模板】扩展中国剩余定理(EXCRT)

模板:

#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;
}

参考

  1. \(\text{12.11 math1.pdf \; \;by Tx\_Lcy}\)
posted @ 2025-04-06 18:52  Hstry  阅读(8)  评论(0)    收藏  举报