完全抄袭自 【博客链接】
形式
有等式:
[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;
}