拓展中国剩余定理 exCRT
求解如下形式的一元线性同余方程组(其中
- 推导:从简单入手,先考虑同于方程组只有两个式子的情况
变形:
联立:
移项:
用
方程有解的条件为
对于上面的方程,两边同除
转换:
同余式两边同除
将
得:
推广一下
我们每次把两个同余式合并,求解之后得到一个新的同余式。再把新的同余式和其他的联立,最终就可以求出满足条件的解。
code
//#define int __int128 const int N = 1e5 + 10; int n, M[N], C[N]; int gcd(int a, int b) { return !b ? a : gcd(b, a % b); } int exgcd(int a, int b, int &x, int &y) { if (!b) { x = 1, y = 0; return a; } int d = exgcd(b, a % b, y, x); y -= a / b * x; return d; } int inv(int a, int b) { int x, y; exgcd(a, b, x, y); return x < 0 ? x += b : x; } signed main() { rd(n); for (int i = 1; i <= n; i ++ ) rd(M[i]), rd(C[i]); bool flag = 1; for (int i = 2; i <= n; i ++ ) { int M1 = M[i - 1], M2 = M[i], C1 = C[i - 1], C2 = C[i], t = gcd(M1, M2); if ((C2 - C1) % t != 0) { flag = 0; break; } M[i] = (M1 * M2) / t; C[i] = (inv(M1 / t, M2 / t) * (C2 - C1) / t) % (M2 / t) * M1 + C1; C[i] = (C[i] % M[i] + M[i]) % M[i]; } if (flag) wr(C[n]); else puts(""); return 0; }
本文作者:kroyosh
本文链接:https://www.cnblogs.com/kroyosh/p/16611625.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步