中国剩余定理(CRT)
前置知识:拓展欧几里得算法
当 bi 两两互质,CRT 可以求解这样的同余方程组:
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧x≡a1(modb1)x≡a2(modb2)x≡a3(modb3)⋮x≡an(modbn)
显然,如果有解,肯定是模 lcm(b1,b2,…,bn) 意义下的解。
如果 bi 两两互质,那么 CRT 可以给出模 ∏i=1nbi 的意义下的唯一解的构造方式。
构造
设 M 为 ∏i=1nbi,mi 为 biM。
因为 bi 两两互质,所以 gcd(bi,mi)=1。
对于每一个 i,解出二元一次不定方程 uimi+vibi=gcd(bi,mi)。
解 x 即为 ∑i=1naiuimi。
证明
我们来验证一下构造的正确性。
对于每个 i:
x≡i=1∑naiuimi≡aiuimi≡ai(1−vibi)≡ai
对于每个 i,都使用一次拓欧,时间复杂度为 O(∑logbi)。
代码实现:
#include <cstdio>
#define ll long long
int n, a[11], b[11];
ll exgcd(ll a, ll b, ll& x, ll& y){
if (!b){
x = 1, y = 0;
return a;
}
ll ret = exgcd(b, a % b, x, y);
ll t = x;
x = y;
y = t - (a / b) * y;
return ret;
}
ll M = 1, Mi[11], x, y, ans;
int main(){
scanf("%d", &n);
for (int i = 1;i <= n;i ++) scanf("%d%d", &a[i], &b[i]), M *= a[i];
for (int i = 1;i <= n;i ++){
Mi[i] = M / a[i];
ll x, y;
exgcd(Mi[i], a[i], x, y);
ans += b[i] * Mi[i] * (x < 0 ? x + a[i] : x);
}
printf("%lld", ans % M);
}