解线性同余方程组
想必学完exgcd的各位dalao们都已经明白如何求解同余方程了
今天本蒟蒻只是想讲讲线性同余方程组的解法供各位大佬批评指错
我们现在有一些线性同余方程
X=b1 (mod a1)
X=b2 (mod a2)
...
X=bn (mod an)
对于前面第一个方程,我们可以用exgcd求出一个X满足一式
不妨设X=a1*y1+b1
若存在X满足二式,则a1*y1+b1=b2 (mod a2)
所以y1=(b2-b1)/a1 (mod a2)
该式有解当且仅当(b2-b1)|gcd(a1,a2)
所以a1y1+a2y2=b2-b1
那么我们就可以用exgcd求出y1的解,进而求出X
那么问题来了,一式二式合并后是什么呢?
我们可以证明在lcm(a1,a2)中有且仅有一个X满足条件,利用一些初中同余知识就可以,在这里就不详细证明了
由此我们得到一个新方程X=X(mod lcm(a1,a2))
用这个方程再和后面的方程合并,for example,anslcm(a1,a2)+a3y3=b3-X
这样一个一个往下求便可以求出答案
下面是一个裸的模板
#include<cstdio>
#define ll long long
ll x,m,M,r,y,z;
ll gcd(ll a,ll b) {return a%b==0 ? b:gcd(b,a%b);}
void inv(ll a,ll b) {
if (a%b==0)
{z=0; y=1; return;}
inv(b,a%b);
ll r=z;
z=y,y=r-a/b*y;
}
int main()
{
int n;
scanf("%d",&n);
x=0; m=1;
for (int i=1;i<=n;i++){
scanf("%lld%lld",&M,&r);
ll b=r-x,d=gcd(m,M);
if (b%d!=0) {
printf("-1");
return 0;
}
inv(m/d,M/d);
ll t=b/d*z%(M/d);
x=x+m*t;
m*=M/d;
}
printf("%lld\n\n",x>0 ? x:x+m);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人