线性同余不等式
完全抄袭自 【博客链接】
形式
有等式:
\[L\le Dx\mod M\le R
\]
其中 \(L,R,D\in [0,M)\) 且 \(L\le R\)。
\(L,R,D\) 已知, 要求解出满足这个等式的 x。
算法
假设至少存在一个解 x。存在 y, 使得 \(L\le Dx-yM\le R\), 即 \(Dx-R\le yM\le Dx-L\)。
对 \(D\) 取模, 得到:
\[-R \mod D\le y(M\mod D)\mod D\le -L\mod D
\]
按照此形式递归下去即可。
性能
复杂度 \(O(\log)\) 级别。
得到的解是最小非负整数解。
至于为何这样转化后有解性一定与原问题相同,以及为何得到的一定是最小的解,我也没有找到很有说服力的答案。
实现
LL Roxy (LL M, LL D, LL L, LL R) { // -1 <---> No Solution
if (L > R) return -1;
if (L == 0) return 0;
if (D == 0) return -1;
if ((R / D) * D >= L) return (L - 1) / D + 1;
LL y = Roxy (D, M % D, (D - R % D) % D, (D - L % D) % D);
return y == -1 ? -1 : (M * y + L - 1) / D + 1;
}