Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
            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];
                }
            }
Ejemplo n.º 3
0
        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);
        }