扩展中国剩余定理
参考博客
扩展中国剩余定理:
与中国剩余定理同样,但
我们的思想是想办法实现把两个同余式合成一个,以此类推,将整个同余方程组最后都合并成一个同余式,这样就得到了解。
若
:
当且仅当
时有解,用 求得一组解 ,带入方程组中得 。
的通解为 令
,则 这样就把两个同余式换成了一个同余式,以此类推即可求解。
代码
ll exCRT(ll n){
ll M=m[1],R=r[1],x,y;
for(int i=2;i<=n;i++){
ll a=M,b=m[i],c=((r[i]-R)%b+b)%b;
ll d=exgcd(a,b,x,y);
if(c%d) return -1;
x=ksm(x,c/d,b/d);
R+=x*M;
M=a/d*b;
R=(R%M+M)%M;
}
return (R%M+M)%M;
}
有扩展:若同余式的变量上带系数的考虑。
我们已知前
组同余方程的解是
设,则有前 个方程的通解
想得到前组同余方程的解,就是想找到一个 ,满足 。移项即 ,直接 即可。
代码
ll excrt(){
ll ans=0,lcm=1;
//b[i]*x\equiv a[i](mod p[i])
for(int i = 1; i <= n; ++i) {
A = b[i] * lcm % p[i];
B = p[i];
C = (a[i]-b[i]*ans%p[i]+p[i]) % p[i];
exgcd(A, B, x, y, gcd);
ll g = B / gcd;
x = (x % g + g) % g;
if(C % gcd) return -1;
ll mod = LCM(lcm, g);
(ans +=(C/gcd) * x % mod * lcm % mod)%=mod;
lcm=mod;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探