summaryrefslogtreecommitdiff
path: root/content/math/minMod.cpp
diff options
context:
space:
mode:
authorGloria Mundi <gloria@gloria-mundi.eu>2024-11-16 15:39:23 +0100
committerGloria Mundi <gloria@gloria-mundi.eu>2024-11-16 15:39:23 +0100
commit72bd993483453ed8ebc462f1a33385cd355d486f (patch)
treec5592ba1ed2fed79e26ba6158d097c9ceb43f061 /content/math/minMod.cpp
parent98567ec798aa8ca2cfbcb85c774dd470f30e30d4 (diff)
parent35d485bcf6a9ed0a9542628ce4aa94a3326d0884 (diff)
merge mzuenni changes
Diffstat (limited to 'content/math/minMod.cpp')
-rw-r--r--content/math/minMod.cpp22
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