[数论]中国剩余定理
今天模拟惨啊...被数论水题虐炸了...+红名祭
定理
若有 𝑝1, 𝑝2 … 𝑝𝑛 互质,则对于同余方程组:
𝑥 ≡ 𝑎1 𝑚𝑜𝑑 𝑝1
…
𝑥 ≡ 𝑎𝑛 𝑚𝑜𝑑 𝑝𝑛
在模 𝐿𝐶𝑀 = 𝑝1 ∗ ⋯ ∗ 𝑝𝑛 的意义下x有唯一解
证明
唯一性:若有两组解 𝑥1, 𝑥2 则 𝑥1 − 𝑥2 一定是 0
存在性:构造方法证明,设
𝑀1 = 𝑝2 ∗ ⋯ 𝑝𝑛
𝑖𝑛𝑣1 = 𝑀1−1 𝑚𝑜𝑑 𝑝1
𝑥1 = 𝑎1 ∗ 𝑀1 ∗ 𝑖𝑛𝑣1
可以发现 𝑥1 满足𝑥1 ≡ 𝑎1 𝑚𝑜𝑑 𝑝1,且对所有 𝑝2, … , 𝑝𝑛 取模为0。那么 𝑥1 + 𝑥2 + ⋯ + 𝑥𝑛 就是解。
exgcd用于求逆元
代码如下
void exgcd(int a,int b,int &x,int &y) {
if(b==0) {
x=1,y=0;
return;
}
exgcd(b,a%b,x,y);
int tp = x;
x = y;
y = tp-a/b*y;
}
int chi() {
int ans=0,lcm=1,x,y;
for(int i=1; i<=k; i++)
lcm *= b[i];
for(int i=1; i<=k; i++) {
int tp = lcm/b[i];
exgcd(tp,b[i],x,y);
x = (x%b[i]+b[i])%b[i]; //x要为最小非负整数解
ans = (ans+tp*x*a[i])%lcm;
}
return (ans+lcm)%lcm;
}