线性同余不等式

完全抄袭自 【博客链接


形式

有等式:

\[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;
}
posted @ 2021-03-11 21:28  xwmwr  阅读(214)  评论(0编辑  收藏  举报