标签:剩余 方程组 定理 扩展 tM ex ll equiv
扩展中国剩余定理
问题
对于同余方程组\(x \equiv a_i(mod \ m_i)\),其中\(m_i\)为不一定两两互质的整数,求x的最小非负整数解。
求解
假设已经求出前k-1个方程组成的同余方程组的一个解为x,且M是\(m_1\)~\(m_{k-1}\)的最小公倍数。则前k-1个方程的方程组通解为\(x+iM(i∈Z)\)。那么对于加入第k个方程后的方程组,我们就是要求一个正整数t,使得\(x+tM \equiv a_k(mod \ m_k)\)。转化一下上述式子得\(tM \equiv a_k-x(mod \ m_k)\)。对于这个式子我们已经可以通过扩展欧几里得求解t。若该同余式无解,则整个方程组无解;若有,则前k个同余式组成的方程组的一个解为\(x_k=x+tM\)。
所以整个算法的思路就是求解k次扩展欧几里得。
//扩展欧几里得
void ex_gcd(ll a, ll b, ll& d, ll& x, ll& y) {
if (!b) {
d = a, x = 1, y = 0;
}
else {
ex_gcd(b, a % b, d, y, x);
y -= x * (a / b);
}
}
//扩展中国剩余定理(非互质) x%a[i]=r[i]
//注意这里的符号含义和上面文字部分不同
ll Chinaa(int len, ll* a, ll* r) {
ll M = a[0], R = r[0], x, y, d;
for (int i = 1; i < len; i++) {
ex_gcd(M, a[i], d, x, y);
if ((R - r[i]) % d != 0) return -1;
x = (R - r[i]) / d * x % a[i];
R -= x * M;
M = M / d * a[i];
R %= M;
}
return (R % M + M) % M;
}
标签:剩余,方程组,定理,扩展,tM,ex,ll,equiv 来源: https://www.cnblogs.com/whitetea/p/15054170.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。