线性同余不等式

完全抄袭自 【博客链接


形式

有等式:

[Lle Dxmod Mle R ]

其中 (L,R,Din [0,M))(Lle R)

(L,R,D) 已知, 要求解出满足这个等式的 x。

算法

假设至少存在一个解 x。存在 y, 使得 (Lle Dx-yMle R), 即 (Dx-Rle yMle Dx-L)

(D) 取模, 得到:

[-R mod Dle y(Mmod D)mod Dle -Lmod 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;
}
原文地址:https://www.cnblogs.com/tztqwq/p/14520688.html