public static void Solve() { var(N, Q) = Scanner.Scan <int, int>(); S Operation(S a, S b) => new S(a.X * b.W + b.X, a.W * b.W); var idData = new S(0, 1); var inv9 = ModuloInteger.Inverse(9); S Mapping(int f, S x) => f == 0 ? x : new S((x.W - 1) * inv9 * f, x.W); int Composition(int f, int g) => f == 0 ? g : f; var idInt = 0; var lst = new LazySegmentTree <S, int>(N, Operation, idData, Mapping, Composition, idInt); for (var i = 0; i < N; i++) { lst.Set(i, new S(1, 10)); } for (var i = 0; i < Q; i++) { var(L, R, D) = Scanner.Scan <int, int, int>(); lst.Apply(L - 1, R, D); Console.WriteLine(lst.QueryToAll().X); } }
private static void Initialize() { if (_sumE != null && _sumIe != null) { return; } var m = ModuloInteger.Modulo; _primitiveRoot = PrimitiveRoot(m); _sumE = new ModuloInteger[30]; _sumIe = new ModuloInteger[30]; var es = new ModuloInteger[30]; var ies = new ModuloInteger[30]; var count2 = BitScanForward(m - 1); var e = new ModuloInteger(_primitiveRoot).Power((m - 1) >> count2); var ie = e.Inverse(); for (var i = count2; i >= 2; i--) { es[i - 2] = e; ies[i - 2] = ie; e *= e; ie *= ie; } ModuloInteger now = 1; ModuloInteger inow = 1; for (var i = 0; i < count2 - 2; i++) { _sumE[i] = es[i] * now; _sumIe[i] = ies[i] * inow; now *= ies[i]; inow *= es[i]; } }
public static void Solve() { var(N, K) = Scanner.Scan <int, int>(); var A = Scanner.ScanEnumerable <int>().Select(x => (ModuloInteger)x).ToArray(); var sum = new ModuloInteger[K + 1]; for (var i = 0; i < N; i++) { ModuloInteger x = 1; for (var j = 0; j <= K; j++) { sum[j] += x; x *= A[i]; } } var i2 = ModuloInteger.Inverse(2); for (var i = 1; i <= K; i++) { ModuloInteger answer = 0; for (var j = 0; j <= i; j++) { answer += EnumerationModulo.Combination(i, j) * (sum[j] * sum[i - j] - sum[i]); } answer *= i2; Console.WriteLine(answer); } }
public void Inverse998244353Test() { ModuloInteger.Modulo = 998244353; for (var i = 1; i < 100000; i++) { var x = ModuloInteger.Inverse(i); var y = new ModuloInteger(i).Inverse(); Assert.That(x.Value, Is.GreaterThanOrEqualTo(0)); Assert.That(x.Value, Is.LessThanOrEqualTo(998244353 - 1)); Assert.That(x.Value * i % 998244353, Is.EqualTo(1)); Assert.That(x, Is.EqualTo(y)); } }
public void InverseTest([Values(11, 12, 1000000007, 1000000008)] int n) { ModuloInteger.Modulo = n; for (var i = 1; i < Math.Min(n, 100000); i++) { if (GreatestCommonDivisor(i, n) != 1) { continue; } var x = ModuloInteger.Inverse(i); var y = new ModuloInteger(i).Inverse(); Assert.That(x * i % n, Is.EqualTo(1)); Assert.That(x, Is.EqualTo(y)); } }
public void Modulo1Test() { ModuloInteger.Modulo = 1; for (var i = 0; i < 100; i++) { for (var j = 0; j < 100; j++) { Assert.That((i * (ModuloInteger)j).Value, Is.Zero); } } ModuloInteger l = 1234; ModuloInteger r = 5678; Assert.That((l + r).Value, Is.Zero); Assert.That((l - r).Value, Is.Zero); Assert.That((l * r).Value, Is.Zero); Assert.That(l.Power(r.Value).Value, Is.Zero); Assert.That(l.Inverse().Value, Is.Zero); }