模线性方程组(中国剩余定理+通用解法)

本文详细介绍了中国剩余定理的应用及解决线性同余方程组的方法,包括特殊情况下的求解步骤与通用解法,提供了具体的算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求解

xa1 (mod m1)xa2 (mod m2)xa3 (mod m3)...xan (mod mn){x≡a1 (mod m1)x≡a2 (mod m2)x≡a3 (mod m3)...x≡an (mod mn)

中国剩余定理

m1,m2,m3,...,mnm1,m2,m3,...,mn两两互质,则可用中国剩余定理

M=ni=1miM=∏i=1nmiMi=M/miMi=M/mititiMiMi(mod mi)(mod mi)意义下的逆元,那么通解为

x=kM+i=1naitiMix=kM+∑i=1naitiMi

解释一下: 懒得证
因为tiMi1 (mod mi)tiMi≡1 (mod mi),而Mj0 (mod mi) (ji)Mj≡0 (mod mi) (j≠i),所以整个求和式子中,模mimi有用的就只剩下aitiMiai (mod mi)aitiMi≡ai (mod mi),对每一个mimi都如此,满足所有条件。

通用解法

不要求m1,m2,m3,...,mnm1,m2,m3,...,mn两两互质的解法

首先考虑只有两个方程

{xa1 (mod m1)xa2 (mod m2){x≡a1 (mod m1)x≡a2 (mod m2)


{x=a1+m1k1x=a2+m2k2{x=a1+m1k1x=a2+m2k2

a1+m1k1=a2+m2k2a1+m1k1=a2+m2k2

m1k1m2k2=a2a1m1k1−m2k2=a2−a1

用exgcd求不定方程,将k1k1k2k2解出,并带入原方程,得到一个特解xx
可知这两个方程的通解X
X=x+t×lcm(m1,m2)X=x+t×lcm(m1,m2)


Xx (mod lcm(m1,m2) )X≡x (mod lcm(m1,m2) )

我们已经成功把两个方程合为一个,只需要继续把这个方程与方程组其他方程一一合并,就求出解了

模板题

HDU1573,求解的个数

#include<cstdio>
const int MAXM=13;
long long gcd(long long a,long long b,long long &x,long long &y)
{
    if(b==0)
    {
        x=1;y=0;
        return a;
    }
    long long xx,yy,d=gcd(b,a%b,xx,yy);
    x=yy;
    y=xx-a/b*yy;
    return d;
}
long long a[MAXM],b[MAXM];
int main()
{
    int T,M;
    long long N,A,B,d,l,x,y,p,q,r;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%I64d%d",&N,&M);
        for(int i=1;i<=M;i++)
            scanf("%I64d",a+i);
        for(int i=1;i<=M;i++)
            scanf("%I64d",b+i);
        A=a[1];B=b[1];
        bool flag=true;
        for(int i=2;i<=M;i++)
        {
            p=A;q=a[i];r=b[i]-B;
            d=gcd(p,q,x,y);
            if(r%d)
            {flag=false;break;}
            p/=d;q/=d;r/=d;
            x=x*r;
            x=(x%q+q)%q;
            l=A/d*a[i];
            B=x*A+B;
            B=(B%l+l)%l;
            A=l;
            if(B>N)break;
        }
        if(flag&&B<=N)
            printf("%I64d\n",(N-B)/A+(B!=0));
        else
            puts("0");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CaptainHarryChen

随便

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值