コード例 #1
0
            public static DPState operator-(DPState state1, DPState state2)
            {
                var size  = state1.Size - state2.Size;
                var count = state1.Count / (Modular.Combination(state1.Size, state2.Size) * state2.Count);

                return(new DPState(count, size));
            }
コード例 #2
0
            public static DPState operator+(DPState state1, DPState state2)
            {
                var size  = state1.Size + state2.Size;
                var count = Modular.Combination(size, state1.Size) * state1.Count * state2.Count;

                return(new DPState(count, size));
            }
コード例 #3
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var n = inputStream.ReadInt();
            var c = inputStream.ReadLongArray();

            var  costs  = new long[n + 1];  // 0≦i≦N個違ったときに支払うトータルコスト
            long subSum = 0;

            for (int i = 0; i < c.Length; i++)
            {
                subSum      += c[i];
                costs[i + 1] = costs[i] + subSum;
            }

            var totalCost = new Modular(0);

            for (int i = 1; i <= n; i++)
            {
                totalCost += Modular.Combination(n, i) * new Modular(costs[i]);
            }

            totalCost *= Modular.Pow(new Modular(2), n);

            yield return(totalCost.Value);
        }
コード例 #4
0
ファイル: QuestionA.cs プロジェクト: terry-u16/AtCoder
            public DPState Multiply(DPState other)
            {
                var size  = Size + other.Size;
                var count = Modular.Combination(size, Size) * Count * other.Count;

                return(new DPState(count, size));
            }
コード例 #5
0
ファイル: QuestionF.cs プロジェクト: terry-u16/AtCoder
            public CountAndWay Multiply(CountAndWay other)
            {
                var sum = Count + other.Count;
                var way = Modular.Combination(sum, Count) * Way * other.Way;

                return(new CountAndWay(sum, way));
            }
コード例 #6
0
        Modular Count(int height, int width, int k)
        {
            var patterns = Modular.Combination(height * width - 2, k - 2);

            var sum = new Modular(0);

            for (int d = 1; d < width; d++)
            {
                sum += new Modular(d) * new Modular(height) * new Modular(height) * new Modular(width - d);
            }

            return(patterns * sum);
        }
コード例 #7
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            Modular.InitializeCombinationTable(1_000_000);
            var(n, m) = inputStream.ReadValue <int, int>();
            var count = Modular.Zero;

            for (int duplicated = 0; duplicated <= n; duplicated++)
            {
                var sign = (duplicated & 1) == 0 ? 1 : -1;
                count += sign * Modular.Combination(n, duplicated) * Modular.Permutation(m, duplicated) * Modular.Pow(Modular.Permutation(m - duplicated, n - duplicated), 2);
            }

            yield return(count.Value);
        }
コード例 #8
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            const int mod = 998244353;

            var(blockCount, colorCount, maxPair) = inputStream.ReadValue <int, int, int>();

            var total = new Modular(0, mod);

            for (int i = 0; i <= maxPair; i++)
            {
                total += Modular.Combination(blockCount - 1, i, mod) * Modular.Pow(new Modular(colorCount - 1, mod), blockCount - i - 1) * new Modular(colorCount, mod);
            }

            yield return(total.Value);
        }
コード例 #9
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var(n, k) = inputStream.ReadValue <int, int>();
            Modular.InitializeCombinationTable();

            var count = Modular.Zero;

            for (int empty = 0; empty < k; empty++)
            {
                var sign = (empty & 1) == 0 ? 1 : -1;
                count += sign * Modular.Combination(k, empty) * Modular.Pow(k - empty, n);
            }

            yield return(count.Value);
        }
コード例 #10
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var nk = inputStream.ReadIntArray();
            var n  = nk[0];
            var k  = nk[1];

            Modular total        = new Modular(0);
            var     maxMoveCount = Math.Min(n - 1, k);

            for (int i = 0; i <= maxMoveCount; i++)
            {
                total += Modular.Combination(n, i) * Modular.CombinationWithRepetition(n - i, i);
            }

            yield return(total.Value);
        }
コード例 #11
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var(children, candies) = inputStream.ReadValue <int, int>();
            Modular.InitializeCombinationTable();

            if (children > candies)
            {
                yield return(Modular.CombinationWithRepetition(children, candies));
            }
            else
            {
                var less         = candies / children;
                var moreChildren = candies - less * children;
                yield return(Modular.Combination(children, moreChildren));
            }
        }
コード例 #12
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var k          = inputStream.ReadInt();
            var s          = inputStream.ReadLine();
            var lastLength = s.Length + k;

            Modular.InitializeCombinationTable(2500000);

            var count = Modular.Zero;

            for (int lastS = s.Length; lastS <= lastLength; lastS++)
            {
                count += Modular.Combination(lastS - 1, s.Length - 1) * Modular.Pow(25, lastS - s.Length) * Modular.Pow(26, lastLength - lastS);
            }

            yield return(count.Value);
        }
コード例 #13
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var n = inputStream.ReadInt();
            var a = inputStream.ReadIntArray();

            var duplicated = a.GroupBy(i => i).Single(g => g.Count() > 1).Key;
            var leftIndex  = -1;
            var rightIndex = -1;


            for (int i = 0; i < a.Length; i++)
            {
                if (a[i] == duplicated)
                {
                    if (leftIndex == -1)
                    {
                        leftIndex = i;
                    }
                    else
                    {
                        rightIndex = i;
                    }
                }
            }

            var left   = leftIndex;
            var right  = a.Length - rightIndex - 1;
            var center = rightIndex - leftIndex - 1;

            for (int length = 1; length <= a.Length; length++)
            {
                var total = Modular.Combination(a.Length, length);

                if (left + right >= length - 1)
                {
                    total -= Modular.Combination(left + right, length - 1);
                }

                yield return(total.Value);
            }
        }
コード例 #14
0
ファイル: QuestionE.cs プロジェクト: terry-u16/AtCoder
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            Modular.InitializeCombinationTable();
            var(n, k) = inputStream.ReadValue <int, int>();
            var a = inputStream.ReadIntArray();

            Array.Sort(a);
            var result = Modular.Zero;

            for (int i = 0; i <= n - k; i++)
            {
                result -= a[i] * Modular.Combination(n - i - 1, k - 1);
            }

            for (int i = k - 1; i < a.Length; i++)
            {
                result += a[i] * Modular.Combination(i, k - 1);
            }

            yield return(result);
        }
コード例 #15
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            Modular.InitializeCombinationTable();
            var n     = inputStream.ReadInt();
            var a     = inputStream.ReadIntArray();
            var diffs = new Modular[a.Length - 1];

            for (int i = 0; i < diffs.Length; i++)
            {
                diffs[i] = new Modular(Math.Abs(a[i] - a[i + 1]));
            }

            var result = Modular.GetZero();

            for (int i = 0; i < diffs.Length; i++)
            {
                result += diffs[i] * Modular.Combination(diffs.Length - 1, i);
            }

            yield return(result);
        }
コード例 #16
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            Modular.Mod = 1_000_000_007;
            Modular.InitializeCombinationTable();
            var n = inputStream.ReadInt();
            var a = inputStream.ReadIntArray();

            var(dupLeft, dupRight) = GetDuplicatedIndices(a);

            var left  = dupLeft;
            var right = a.Length - dupRight - 1;

            for (int k = 1; k <= a.Length; k++)
            {
                var count = Modular.Combination(a.Length, k);
                if (left + right >= k - 1)
                {
                    count -= Modular.Combination(left + right, k - 1);
                }
                yield return(count);
            }
        }
コード例 #17
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            Modular.Mod = 998244353;
            Modular.InitializeCombinationTable();
            var(n, a, b, k) = inputStream.ReadValue <int, int, int, long>();
            var count = Modular.Zero;

            for (int x = 0; x <= n; x++)
            {
                var remain = k - (long)a * x;
                if (remain >= 0 && remain % b == 0)
                {
                    var y = remain / b;
                    if (y <= n)
                    {
                        count += Modular.Combination(n, x) * Modular.Combination(n, (int)y);
                    }
                }
            }

            yield return(count);
        }
コード例 #18
0
ファイル: QuestionC.cs プロジェクト: terry-u16/AtCoder
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var(_, k) = inputStream.ReadValue <int, int>();
            var a = inputStream.ReadIntArray();

            Array.Sort(a);

            var sum = Modular.Zero;

            Modular.InitializeCombinationTable();

            for (int i = 0; i <= a.Length - k; i++)
            {
                sum += -a[i] * Modular.Combination(a.Length - i - 1, k - 1);
            }

            for (int i = k - 1; i < a.Length; i++)
            {
                sum += a[i] * Modular.Combination(i, k - 1);
            }

            yield return(sum);
        }
コード例 #19
0
ファイル: QuestionB.cs プロジェクト: terry-u16/AtCoder
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            Modular.InitializeCombinationTable();
            var(n, m) = inputStream.ReadValue <int, int>();
            var primes = PrimeFactorize(Math.Abs(n)).GroupBy(i => i).Select(g => (g.Key, g.Count()));

            var count = Modular.One;

            foreach (var(_, c) in primes)
            {
                count *= Modular.CombinationWithRepetition(m, c);
            }

            var minusCombination = Modular.Zero;

            for (int i = (-Math.Sign(n) + 1) / 2; i <= m; i += 2)
            {
                minusCombination += Modular.Combination(m, i);
            }

            count *= minusCombination;

            yield return(count.Value);
        }
コード例 #20
0
        Modular Sum(int width, int height, int k)
        {
            var result  = Modular.Zero;
            var squares = width * height;

            for (int distance = 1; distance < width; distance++)
            {
                result += new Modular(distance) * new Modular(height) * new Modular(height) * Modular.Combination(squares - 2, k - 2) * new Modular(width - distance);
            }

            return(result);
        }