[Registro de aprendizaje] Desigualdad de congruencia lineal

Considere la solución L ≤ D x mod M ≤ RL \ le Dx \ bmod M \ le RLD xm o dMETROR, 其中0 ≤ L ≤ R <M, D <M 0 \ le L \ le R <M, D <M0LR<M ,re<M .

Suponiendo que hay una solución, entonces existe yyy, 使得L ≤ D x - M y ≤ ML \ le Dx -My \ le MLD x-M yM . Deformado para obtener
D x - R ≤ M y ≤ D x - L Dx-R \ le My \ le Dx-LD x-RM yD 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;
}

Supongo que te gusta

Origin blog.csdn.net/zqy1018/article/details/108780838
Recomendado
Clasificación