summaryrefslogtreecommitdiff
path: root/math/chineseRemainder.cpp
diff options
context:
space:
mode:
authorMZuenni <michi.zuendorf@gmail.com>2023-02-13 19:39:30 +0100
committerMZuenni <michi.zuendorf@gmail.com>2023-02-13 19:39:30 +0100
commit3a98de95336d3deb5d78cafdde6cc63dc3fd5f4f (patch)
tree30f0428accc66062a07026a2bfa15fb88647523d /math/chineseRemainder.cpp
parent54946c9945857e42b8eb4025a66d3344bd53f07c (diff)
squezed in new code :D
Diffstat (limited to 'math/chineseRemainder.cpp')
-rw-r--r--math/chineseRemainder.cpp14
1 files changed, 6 insertions, 8 deletions
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<lll> lhs, rhs, mods, inv;
lll M; // Produkt über die Moduli. Kann leicht überlaufen.
- ll g(vector<lll> &vec) {
+ ll g(const vector<lll> &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<lll>());
inv.resize(sz(lhs));
for (int i = 0; i < sz(lhs); i++) {