AcWing算法提高课 中国剩余定理 求解多个线性同余方程

 

 

 

 注意这里是构造了一个解,ti由于Mi与mi互质,可以用ExGCD求解

例题:https://www.acwing.com/problem/content/1300/

模板:

复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

const int N=10;
int m[N],a[N];
LL ExGCD(LL a,LL b,LL &x,LL &y)
{
    if(b==0)
    {
        x=1,y=0;
        return a;
    }
    LL xx,yy;
    LL gcd=ExGCD(b,a%b,xx,yy);
    x=yy;
    y=xx-a/b*yy;
    return gcd;
}
LL Inv(LL num,LL MOD)
{
    LL res,k;
    ExGCD(num,MOD,res,k);
    return res;
}
int main()
{
    int n;cin>>n;
    long long M=1;
    for(int i=0;i<n;i++)
    {
        cin>>m[i]>>a[i];
        M*=m[i];
    }
    LL res=0;
    for(int i=0;i<n;i++)
    {
        res+=a[i]*M/m[i]*Inv(M/m[i],m[i]);
    }
    res=(res%M+M)%M;
    //要求最小正整数解,故结果对M取正余数
    //因为M是全部a的最小公倍数,对于线性同余方城,取模后不影响结果
    cout<<res<<endl;
}
View Code
复制代码

 

posted @   80k  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示