Example #1
0
        public static void Solve()
        {
            var(N, M, K) = Scanner.Scan <long, long, long>();
            const long p   = (long)1e9 + 7;
            var        all = N * M;

            var cx = N * N % p;

            cx *= Enumeration.CombinationCount(all - 2, K - 2, p);
            cx %= p;
            var nx = 0L;

            for (var i = 1; i < M; i++)
            {
                nx = (nx + i * (M - i) % p) % p;
            }
            nx = nx * cx % p;

            var cy = M * M % p;

            cy *= Enumeration.CombinationCount(all - 2, K - 2, p);
            cy %= p;
            var ny = 0L;

            for (var i = 1; i < N; i++)
            {
                ny = (ny + i * (N - i) % p) % p;
            }
            ny = ny * cy % p;

            var answer = (nx + ny) % p;

            Console.WriteLine(answer);
        }
Example #2
0
        public static void Solve()
        {
            var(W, H) = Scanner.Scan <int, int>();
            var p = (int)1e9 + 7;

            Console.WriteLine(Enumeration.CombinationCount(W + H - 2, W - 1, p));
        }
Example #3
0
        public static void Solve()
        {
            var       N   = Scanner.Scan <int>();
            const int max = (int)1e5 + 1;
            const int p   = 998244353;

            var G = new ModuloInteger[max];

            G[0] = 1;
            for (var i = 1; i < max; i++)
            {
                G[i] = G[i - 1] * (2 * i - 1);
            }

            var freq = new int[max];

            for (var i = 0; i < 2 * N; i++)
            {
                var H = Scanner.Scan <int>();
                freq[H]++;
            }

            var queue = new Queue <ModuloInteger[]>();

            queue.Enqueue(new ModuloInteger[] { 1 });
            foreach (var n in freq)
            {
                if (n < 2)
                {
                    continue;
                }
                var list = new ModuloInteger[n / 2 + 1];
                for (var i = 0; i * 2 <= n; i++)
                {
                    list[i] = Enumeration.CombinationCount(n, i * 2, p) * G[i];
                    if (i % 2 == 1)
                    {
                        list[i] = -list[i];
                    }
                }
                queue.Enqueue(list);
            }

            while (queue.Count > 1)
            {
                var list1 = queue.Dequeue();
                var list2 = queue.Dequeue();
                queue.Enqueue(Convolution.Execute(list1, list2).ToArray());
            }

            ModuloInteger answer = 0;
            var           last   = queue.Dequeue();

            for (var i = 0; i < last.Length; i++)
            {
                answer += last[i] * G[N - i];
            }

            Console.WriteLine(answer);
        }
Example #4
0
        public static void Solve()
        {
            var(N, M) = Scanner.Scan <int, int>();
            const int p      = (int)1e9 + 7;
            var       answer = Enumeration.PermutationCount(M, N, p);

            for (var i = 1; i <= N; i++)
            {
                var tmp = Enumeration.CombinationCount(N, i, p) * Enumeration.PermutationCount(M - i, N - i, p);
                if (i % 2 == 0)
                {
                    answer += tmp;
                }
                else
                {
                    answer -= tmp;
                }
                if (answer < 0)
                {
                    answer += p;
                }
                answer %= p;
            }

            answer *= Enumeration.PermutationCount(M, N, p);
            answer %= p;
            Console.WriteLine(answer);
        }
Example #5
0
        public static void Solve()
        {
            var N      = Scanner.Scan <int>();
            var K      = Scanner.Scan <int>();
            var p      = (int)1e9 + 7;
            var answer = Enumeration.CombinationCount(N - 1 + K, N - 1, p);

            Console.WriteLine(answer);
        }
Example #6
0
        public static void Solve()
        {
            var(N, K) = Scanner.Scan <int, int>();
            const int p = (int)1e9 + 7;

            for (var i = 1; i <= K; i++)
            {
                var a = Enumeration.CombinationCount(N - K + 1, i, p);
                var b = Enumeration.CombinationCount(K - 1, i - 1, p);
                Console.WriteLine(a * b % p);
            }
        }
Example #7
0
        public static void Solve()
        {
            var(R, C) = Scanner.Scan <long, long>();
            var(X, Y) = Scanner.Scan <long, long>();
            var(D, L) = Scanner.Scan <long, long>();
            var p = (int)1e9 + 7;

            long Calc(long x, long y, long d, long l, long mod)
            {
                if (x * y < d + l)
                {
                    return(0);
                }
                var ret = Enumeration.CombinationCount(x * y, d, mod);

                ret *= Enumeration.CombinationCount(x * y - d, l, mod);
                ret %= mod;
                return(ret);
            }

            var pattern = ((R - X + 1) * (C - Y + 1)) % p;
            var comb    = 0L;

            if (D + L == X * Y)
            {
                comb = Enumeration.CombinationCount(D + L, D, p);
            }
            else
            {
                comb = Calc(X, Y, D, L, p);

                comb = (comb + p - (Calc(X - 1, Y, D, L, p) * 2) % p) % p;
                comb = (comb + p - (Calc(X, Y - 1, D, L, p) * 2) % p) % p;

                comb = (comb + (Calc(X - 1, Y - 1, D, L, p) * 4) % p) % p;
                comb = (comb + Calc(X - 2, Y, D, L, p)) % p;
                comb = (comb + Calc(X, Y - 2, D, L, p)) % p;

                comb = (comb + p - (Calc(X - 2, Y - 1, D, L, p) * 2) % p) % p;
                comb = (comb + p - (Calc(X - 1, Y - 2, D, L, p) * 2) % p) % p;

                comb = (comb + Calc(X - 2, Y - 2, D, L, p)) % p;
            }

            var answer = (comb * pattern) % p;

            Console.WriteLine(answer);
        }
Example #8
0
        public static void Solve()
        {
            var HWAB = Console.ReadLine().Trim().Split(' ').Select(long.Parse).ToArray();

            var(H, W, A, B) = (HWAB[0], HWAB[1], HWAB[2], HWAB[3]);
            var p      = (long)1e9 + 7;
            var answer = 0L;

            for (var i = 0; i < H - A; i++)
            {
                var way1 = Enumeration.CombinationCount(i + B - 1, B - 1, p);
                var way2 = Enumeration.CombinationCount(H - i - 1 + W - B - 1, W - B - 1, p);
                answer += (way1 * way2) % p;
                answer %= p;
            }
            Console.WriteLine(answer);
        }
Example #9
0
        public static void Solve()
        {
            var(N, M, K) = Scanner.Scan <int, int, int>();
            const long p      = 998244353;
            var        answer = 0L;

            for (var k = 0; k <= K; k++)
            {
                var comb = M * Enumeration.CombinationCount(N - 1, k, p);
                comb   %= p;
                comb   *= Enumeration.Power(M - 1, N - 1 - k, p);
                comb   %= p;
                answer += comb;
                answer %= p;
            }

            Console.WriteLine(answer);
        }
Example #10
0
        public static void Solve()
        {
            var(X, Y) = Scanner.Scan <int, int>();
            const int p    = (int)1e9 + 7;
            var       step = (X + Y);

            if ((step % 3) != 0)
            {
                Console.WriteLine(0); return;
            }
            var nm = step / 3;
            var n  = X - nm;
            var m  = Y - nm;

            if (n < 0 || m < 0)
            {
                Console.WriteLine(0); return;
            }

            Console.WriteLine(Enumeration.CombinationCount(n + m, n, p));
        }
Example #11
0
        public static void Solve()
        {
            var(N, K) = Scanner.Scan <int, int>();
            var A = Scanner.ScanEnumerable <int>().ToArray();
            var p = (int)1e9 + 7;

            Array.Sort(A);
            var answer = 0L;

            for (var i = 0; i <= N - K; i++)
            {
                answer += (-A[i] * Enumeration.CombinationCount(N - i - 1, K - 1, p) + p) % p;
                answer %= p;
            }

            for (var i = K - 1; i < N; i++)
            {
                answer += A[i] * Enumeration.CombinationCount(i, K - 1, p) % p;
                answer %= p;
            }

            Console.WriteLine(answer);
        }