中国剩余定理-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;
}

 

posted @ 2019-03-07 20:10  darrrr  阅读(162)  评论(0编辑  收藏  举报