diff options
| author | Gloria Mundi <gloria@gloria-mundi.eu> | 2024-11-16 15:39:23 +0100 |
|---|---|---|
| committer | Gloria Mundi <gloria@gloria-mundi.eu> | 2024-11-16 15:39:23 +0100 |
| commit | 72bd993483453ed8ebc462f1a33385cd355d486f (patch) | |
| tree | c5592ba1ed2fed79e26ba6158d097c9ceb43f061 /content/math/minMod.cpp | |
| parent | 98567ec798aa8ca2cfbcb85c774dd470f30e30d4 (diff) | |
| parent | 35d485bcf6a9ed0a9542628ce4aa94a3326d0884 (diff) | |
merge mzuenni changes
Diffstat (limited to 'content/math/minMod.cpp')
| -rw-r--r-- | content/math/minMod.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/content/math/minMod.cpp b/content/math/minMod.cpp new file mode 100644 index 0000000..a80e783 --- /dev/null +++ b/content/math/minMod.cpp @@ -0,0 +1,22 @@ +ll firstVal(ll a, ll m, ll l, ll r) { + if (l == 0) return 0; + if (a == 0) return -1; + if ((l-1)/a < r/a) return (l+a-1) / a*a; + ll s = (r+a-1) / a*a; + ll v = firstVal(m % a, a, s-r, s-l); + return v < 0 ? -1 : s - v; +} + +ll minMod(ll n, ll m, ll a, ll b) { + if (a == 0) return b; + ll g = gcd(m, a); + ll c = b % g; + m /= g; + a /= g; + b /= g; + ll ai = multInv(a, m); + ll l = ai*b % m; + ll r = (n-1 + ai*b) % m; + if (n >= m || l > r) return c; + return a * firstVal(ai, m, l, r) % m * g + c; +}
\ No newline at end of file |
