中国剩余定理-CRT
(好久好久以前就有讲过的)
可惜我太弱了
听了两边都没听懂
而且自己还不研究研究(极度内疚)
就...
哭辽qwq
----------------------------------------------------------------
目的:求解同余方程组:
x≡ a1(modm1)
x≡ a2(modm2)
x≡ a3(modm3)
...
x≡ ak(modmk)
适用范围:m1、m2、…、mk为两两互质的整数
定理:
1.求所有mi 的lcm:M(累乘)(因为他们都互质啊!!!)
2. 求同余方程 (M/mi)*ti≡ 1(mod mi)的最小非负整数解ti
3.有一个解为x=∑k i=1ai*(M/mi)*ti
4.通解为x+i*M (i∈z)
证明:
(M / mi) % mk = 0 (k != i)
因此对于任意k != i
都有 ak * (M / mi) * ti ≡ 0(mod mk)
(M/mi) * ti ≡ 1(mod mi)
根据同余方程的性质
ai * (M / mi) * ti ≡ ai(mod mi)
令x = ai * (M / mi) * ti(i ∈[1,k],i ∈z)的累加
即可满足原同余方程组
通解为x+i∗M(i∈Z)
最小非负整数解为(x%M+M)%M
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 china() { 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]; ans=(ans+tp*x*a[i])%lcm; } return(ans+lcm)%lcm; }