From 3a98de95336d3deb5d78cafdde6cc63dc3fd5f4f Mon Sep 17 00:00:00 2001 From: MZuenni Date: Mon, 13 Feb 2023 19:39:30 +0100 Subject: squezed in new code :D --- math/chineseRemainder.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'math/chineseRemainder.cpp') diff --git a/math/chineseRemainder.cpp b/math/chineseRemainder.cpp index 86a10ae..623f94b 100644 --- a/math/chineseRemainder.cpp +++ b/math/chineseRemainder.cpp @@ -1,14 +1,13 @@ -// Laufzeit: O(n * log(n)), n := Anzahl der Kongruenzen -// Nur für teilerfremde Moduli. Berechnet das kleinste, -// nicht negative x, das alle Kongruenzen simultan löst. -// Alle Lösungen sind kongruent zum kgV der Moduli -// (Produkt, falls alle teilerfremd sind). +// Laufzeit: O(n * log(n)), n := Anzahl der Kongruenzen. Nur für +// teilerfremde Moduli. Berechnet das kleinste, nicht negative x, +// das alle Kongruenzen simultan löst. Alle Lösungen sind +// kongruent zum kgV der Moduli (Produkt, da teilerfremd). struct ChineseRemainder { using lll = __int128; vector lhs, rhs, mods, inv; lll M; // Produkt über die Moduli. Kann leicht überlaufen. - ll g(vector &vec) { + ll g(const vector &vec) { lll res = 0; for (int i = 0; i < sz(vec); i++) { res += (vec[i] * inv[i]) % M; @@ -24,8 +23,7 @@ struct ChineseRemainder { mods.push_back(m); } - // Löst das System. - ll solve() { + ll solve() { // Löst das System. M = accumulate(all(mods), lll(1), multiplies()); inv.resize(sz(lhs)); for (int i = 0; i < sz(lhs); i++) { -- cgit v1.2.3