Considere la solución L ≤ D x mod M ≤ RL \ le Dx \ bmod M \ le RL≤D xm o dMETRO≤R, 其中0 ≤ L ≤ R <M, D <M 0 \ le L \ le R <M, D <M0≤L≤R<M ,re<M .
Suponiendo que hay una solución, entonces existe yyy, 使得L ≤ D x - M y ≤ ML \ le Dx -My \ le ML≤D x-M y≤M . Deformado para obtener
D x - R ≤ M y ≤ D x - L Dx-R \ le My \ le Dx-LD x-R≤M y≤D x-L
A DDD取 模 , 得到
- R mod D ≤ (M mod D) y mod D ≤ - L mod D -R \ bmod D \ le (M \ bmod D) y \ bmod D \ le -L \ bmod D- Rm o dre≤( Mm o dD ) ym o dre≤- Lm o dre
Entonces se convierte en una forma más pequeña, que puede repetirse de acuerdo con esta forma. La complejidad es la misma que la de la división, que es O (log n) O (\ log n)O ( lo gn ) . La solución obtenida de esta manera es la solución entera no negativa más pequeña.
En cuanto a por qué la solución después de tal transformación debe ser la misma que la pregunta original y por qué la solución debe ser la más pequeña, no he encontrado una respuesta convincente.
Tome POJ 3530 como ejemplo, dé la realización:
ll modinq(ll m, ll d, ll l, ll r){
// 0 <= l <= r < m, d < m, minimal non-negative solution
if (r < l) return -1;
if (l == 0) return 0;
if (d == 0) return -1;
if ((r / d) * d >= l) return (l - 1) / d + 1;
ll res = modinq(d, m % d, (d - r % d) % d, (d - l % d) % d);
return res == -1 ? -1: (m * res + l - 1) / d + 1;
}