Exemple #1
0
        public static void Solve()
        {
            var(N, K) = Scanner.Scan <long, long>();
            mint answer = K;

            if (N > 1)
            {
                answer *= K - 1;
            }
            if (N > 2)
            {
                answer *= mint.Power(K - 2, N - 2);
            }
            Console.WriteLine(answer);
        }
Exemple #2
0
        public static void Solve()
        {
            var(N, K) = Scanner.Scan <int, int>();
            mint answer = 0;

            if (N <= K)
            {
                answer = ModuloMathematics.Combination(N, K % N);
            }
            else
            {
                answer = ModuloMathematics.Combination(N + K - 1, K);
            }
            Console.WriteLine(answer);
        }
Exemple #3
0
        public static void Solve()
        {
            var(N, M, K, S, T, X) = Scanner.Scan <int, int, int, int, int, int>();
            S--; T--; X--;
            var G = new List <int> [N].Select(x => new List <int>()).ToArray();

            for (var i = 0; i < M; i++)
            {
                var(u, v) = Scanner.Scan <int, int>();
                u--; v--;
                G[u].Add(v);
                G[v].Add(u);
            }

            var dp = new mint[K + 1, N, 2];

            dp[0, S, 0] = 1;
            var used  = new bool[K + 1, N, 2];
            var queue = new Queue <(int U, int T, int X)>();

            queue.Enqueue((S, 0, 0));
            while (queue.Count > 0)
            {
                var(u, t, x) = queue.Dequeue();
                if (t == K || used[t, u, x])
                {
                    continue;
                }
                used[t, u, x] = true;
                foreach (var v in G[u])
                {
                    if (v == X)
                    {
                        dp[t + 1, v, x ^ 1] += dp[t, u, x];
                        queue.Enqueue((v, t + 1, x ^ 1));
                    }
                    else
                    {
                        dp[t + 1, v, x] += dp[t, u, x];
                        queue.Enqueue((v, t + 1, x));
                    }
                }
            }

            var answer = dp[K, T, 0];

            Console.WriteLine(answer);
        }
Exemple #4
0
        public static void Solve()
        {
            var(N, K) = Scanner.Scan <int, int>();
            var dp = new mint[N + 1, N * 2 + 1];

            dp[1, 1] = 1;
            for (var n = 2; n <= N; n++)
            {
                for (var k = n; k > 0; k--)
                {
                    dp[n, k] = dp[n - 1, k - 1] + dp[n, k * 2];
                }
            }

            Console.WriteLine(dp[N, K]);
        }
Exemple #5
0
        public static void Solve()
        {
            var N = Scanner.Scan <int>();
            var C = Scanner.ScanEnumerable <long>().ToArray();

            Array.Sort(C);

            mint answer = 1;

            for (var i = 0; i < N; i++)
            {
                answer *= Math.Max(0, C[i] - i);
            }

            Console.WriteLine(answer);
        }
Exemple #6
0
        public static void Solve()
        {
            var N = Scanner.Scan <int>();
            var A = Scanner.ScanEnumerable <long>().Distinct().ToArray();

            Array.Sort(A, (x, y) => x.CompareTo(y));
            var  prev   = 0L;
            mint answer = 1;

            foreach (var a in A)
            {
                answer *= a - prev + 1;
                prev    = a;
            }
            Console.WriteLine(answer);
        }
Exemple #7
0
        public static void Solve()
        {
            var(H, W) = Scanner.Scan <int, int>();
            var G = new bool[H][];

            for (var i = 0; i < H; i++)
            {
                var S = Scanner.Scan <string>();
                G[i] = S.Select(x => x == '.').ToArray();
            }

            var dp = new mint[H, W];
            var x  = new mint[H, W];
            var y  = new mint[H, W];
            var z  = new mint[H, W];

            dp[0, 0] = 1;
            for (var i = 0; i < H; i++)
            {
                for (var j = 0; j < W; j++)
                {
                    if (i == 0 && j == 0)
                    {
                        continue;
                    }
                    if (!G[i][j])
                    {
                        continue;
                    }
                    if (j > 0)
                    {
                        x[i, j] = x[i, j - 1] + dp[i, j - 1];
                    }
                    if (i > 0)
                    {
                        y[i, j] = y[i - 1, j] + dp[i - 1, j];
                    }
                    if (i > 0 && j > 0)
                    {
                        z[i, j] = z[i - 1, j - 1] + dp[i - 1, j - 1];
                    }
                    dp[i, j] = x[i, j] + y[i, j] + z[i, j];
                }
            }

            Console.WriteLine(dp[H - 1, W - 1]);
        }
Exemple #8
0
        public static void Solve()
        {
            var(N, M) = Scanner.Scan <int, int>();
            if (M == 1)
            {
                Console.WriteLine(1); return;
            }

            mint answer = 1;

            foreach (var v in Prime.GetFactors(M).Values)
            {
                answer *= EnumerationModulo.Combination(v + N - 1, N - 1);
            }

            Console.WriteLine(answer);
        }
Exemple #9
0
        public static void Solve()
        {
            var(N, K) = Scanner.Scan <int, int>();
            var G = new int[N][];

            for (var i = 0; i < N; i++)
            {
                G[i] = Scanner.ScanEnumerable <int>().ToArray();
            }

            mint answer = 1;
            var  dsu1   = new DisjointSetUnion(N);
            var  dsu2   = new DisjointSetUnion(N);

            for (var i = 0; i < N; i++)
            {
                for (var j = i + 1; j < N; j++)
                {
                    var(ok1, ok2) = (true, true);
                    for (var k = 0; k < N; k++)
                    {
                        ok1 &= G[k][i] + G[k][j] <= K;
                        ok2 &= G[i][k] + G[j][k] <= K;
                    }
                    if (ok1)
                    {
                        dsu1.Merge(i, j);
                    }
                    if (ok2)
                    {
                        dsu2.Merge(i, j);
                    }
                }
            }

            foreach (var group in dsu1.GetGroups())
            {
                answer *= EnumerationModulo.Factorial(group.Count());
            }
            foreach (var group in dsu2.GetGroups())
            {
                answer *= EnumerationModulo.Factorial(group.Count());
            }

            Console.WriteLine(answer);
        }
Exemple #10
0
        public static void Solve()
        {
            var(H, W) = Scanner.Scan <int, int>();
            var G = new char[H][];

            for (var i = 0; i < H; i++)
            {
                G[i] = Scanner.Scan <string>().ToCharArray();
            }

            var HW = H + W - 2;
            var rc = new int[HW + 1];
            var bc = new int[HW + 1];

            for (var i = 0; i < H; i++)
            {
                for (var j = 0; j < W; j++)
                {
                    if (G[i][j] == 'R')
                    {
                        rc[i + j]++;
                    }
                    if (G[i][j] == 'B')
                    {
                        bc[i + j]++;
                    }
                }
            }

            mint answer = 1;

            for (var i = 0; i <= HW; i++)
            {
                if (rc[i] == 0 && bc[i] == 0)
                {
                    answer *= 2;
                }
                if (rc[i] > 0 && bc[i] > 0)
                {
                    answer = 0;
                }
            }

            Console.WriteLine(answer);
        }
Exemple #11
0
        public static void Solve()
        {
            var N   = Scanner.Scan <int>();
            var W   = Scanner.ScanEnumerable <int>().ToArray();
            var sum = W.Sum();

            if (sum % 2 == 1)
            {
                Console.WriteLine(0); return;
            }

            var max = (N + 1) * 100;

            var dp = new mint[N + 1, max + 1];

            dp[0, 0] = 1;
            for (var i = 0; i < N; i++)
            {
                for (var j = i; j >= 0; j--)
                {
                    for (var k = 0; k <= sum; k++)
                    {
                        dp[j + 1, k + W[i]] += dp[j, k];
                    }
                }
            }

            var fact = new mint[N + 1];

            fact[0] = 1;
            for (var i = 1; i <= N; i++)
            {
                fact[i] = fact[i - 1] * i;
            }

            var  half   = sum / 2;
            mint answer = 0;

            for (var i = 0; i <= N; i++)
            {
                answer += dp[i, half] * fact[i] * fact[N - i];
            }

            Console.WriteLine(answer);
        }
Exemple #12
0
        public static void Solve()
        {
            var(N, M, K) = Scanner.Scan <int, int, int>();
            var dp = new mint[N + 1, M + 10];

            for (var j = 1; j <= M; j++)
            {
                dp[0, j] = 1;
            }

            for (var i = 0; i < N; i++)
            {
                var cum = new mint[M + 10];
                for (var j = 1; j <= M; j++)
                {
                    cum[j + 1] = cum[j] + dp[i, j];
                }

                for (var j = 1; j <= M; j++)
                {
                    if (K > 0)
                    {
                        var l1 = 0;
                        var r1 = Math.Max(0, j - K) + 1;
                        var l2 = Math.Min(M + 1, j + K);
                        var r2 = M + 1;
                        dp[i + 1, j] += cum[r1] - cum[l1] + cum[r2] - cum[l2];
                    }
                    else
                    {
                        dp[i + 1, j] += cum[M + 1];
                    }
                }
            }

            mint answer = 0;

            for (var i = 1; i <= M; i++)
            {
                answer += dp[N - 1, i];
            }

            Console.WriteLine(answer);
        }
Exemple #13
0
        public static void Solve()
        {
            var(N, L) = Scanner.Scan <int, int>();
            var dp = new mint[N + 1];

            dp[0] = 1;
            for (var i = 1; i <= N; i++)
            {
                dp[i] += dp[i - 1];
                if (i - L >= 0)
                {
                    dp[i] += dp[i - L];
                }
            }

            var answer = dp[N];

            Console.WriteLine(answer);
        }
Exemple #14
0
        public static void Solve()
        {
            var(N, K) = Scanner.Scan <int, int>();
            var  dp     = new mint[K + 1];
            mint answer = 0;

            for (var k = K; k > 0; k--)
            {
                var sum = mint.Power(K / k, N);
                for (var i = k + k; i <= K; i += k)
                {
                    sum -= dp[i];
                }
                answer += sum * k;
                dp[k]   = sum;
            }

            Console.WriteLine(answer);
        }
Exemple #15
0
        public static void Solve()
        {
            var(A, B, C, D) = Scanner.Scan <int, int, int, int>();
            var dp = new mint[C + 1, D + 1];

            dp[A, B] = 1;
            for (var i = A; i <= C; i++)
            {
                for (var j = B; j <= D; j++)
                {
                    dp[i, j] += dp[i - 1, j] * j;
                    dp[i, j] += dp[i, j - 1] * i;
                    dp[i, j] -= dp[i - 1, j - 1] * (i - 1) * (j - 1);
                }
            }

            var answer = dp[C, D];

            Console.WriteLine(answer);
        }
Exemple #16
0
        public static void Solve()
        {
            var N     = Scanner.Scan <long>();
            var pow10 = new mint[N + 1];

            for (var i = 0; i <= N; i++)
            {
                pow10[i] = mint.Power(i, 10);
            }

            mint answer = 0;

            for (var p = 1; p <= N; p++)
            {
                var q = N / p;
                answer += (pow10[p] - pow10[p - 1]) * pow10[q];
            }

            Console.WriteLine(answer);
        }
Exemple #17
0
        public static void Solve()
        {
            var(N, M) = Scanner.Scan <int, int>();
            var  X = Scanner.ScanEnumerable <long>().Select(x => (mint)x).ToArray();
            var  Y = Scanner.ScanEnumerable <long>().Select(x => (mint)x).ToArray();
            mint l = 0;
            mint r = 0;

            for (var k = 0; k < N; k++)
            {
                l += k * X[k] - (N - k - 1) * X[k];
            }
            for (var k = 0; k < M; k++)
            {
                r += k * Y[k] - (M - k - 1) * Y[k];
            }
            var answer = l * r;

            Console.WriteLine(answer);
        }
Exemple #18
0
        public static void Solve()
        {
            var(N, M) = Scanner.Scan <int, int>();
            var A = Scanner.ScanEnumerable <int>().Distinct().ToArray();
            var B = Scanner.ScanEnumerable <int>().Distinct().ToArray();

            if (A.Length != N || B.Length != M)
            {
                Console.WriteLine(0); return;
            }
            Array.Sort(A);
            Array.Sort(B);
            mint answer = 1;

            for (var x = N * M; x > 0; x--)
            {
                var(uba, ubb) = (LowerBound(A, x), LowerBound(B, x));
                if (uba == N || ubb == M)
                {
                    Console.WriteLine(0); return;
                }
                if (A[uba] == x && B[ubb] == x)
                {
                    continue;
                }
                if (A[uba] == x)
                {
                    answer *= M - ubb;
                }
                else if (B[ubb] == x)
                {
                    answer *= N - uba;
                }
                else
                {
                    answer *= (N - uba) * (M - ubb) - (N * M - x);
                }
            }

            Console.WriteLine(answer);
        }
Exemple #19
0
        public static void Solve()
        {
            var N  = Scanner.Scan <int>();
            var A  = Scanner.ScanEnumerable <int>().ToArray();
            var dp = new mint[N + 1, 10];

            dp[1, A[0]] = 1;
            for (var i = 1; i < N; i++)
            {
                for (var j = 0; j < 10; j++)
                {
                    dp[i + 1, (j + A[i]) % 10] += dp[i, j];
                    dp[i + 1, (j * A[i]) % 10] += dp[i, j];
                }
            }

            for (var i = 0; i < 10; i++)
            {
                Console.WriteLine(dp[N, i]);
            }
        }
Exemple #20
0
        public static void Solve()
        {
            var(N, K) = Scanner.Scan <int, int>();
            var A = Scanner.ScanEnumerable <long>().ToArray();

            var fact  = new mint[K + 10];
            var ifact = new mint[K + 10];

            fact[0] = ifact[0] = 1;
            for (var i = 1; i < K + 10; i++)
            {
                fact[i]  = fact[i - 1] * i;
                ifact[i] = 1 / fact[i];
            }

            mint Combination(long n, int k)
            {
                if (n < 0 || k < 0)
                {
                    return(0);
                }
                mint result = ifact[k];

                for (var i = 0; i < k; i++)
                {
                    result *= n - i;
                }

                return(result);
            }

            mint answer = Combination(A[0] - A.Skip(1).Sum() - 1, K - 1);

            foreach (var a in A.Skip(1))
            {
                answer *= Combination(a + K - 1, K - 1);
            }

            Console.WriteLine(answer);
        }
Exemple #21
0
        public static void Solve()
        {
            var N  = Scanner.Scan <int>();
            var S  = Scanner.Scan <string>();
            var M  = S.Length;
            var T  = new string[N].Select(_ => Scanner.Scan <string>()).ToArray();
            var dp = new mint[M + 1];

            dp[0] = 1;
            for (var i = 0; i < M; i++)
            {
                foreach (var t in T)
                {
                    if (i + t.Length <= M && string.Compare(S, i, t, 0, t.Length) == 0)
                    {
                        dp[i + t.Length] += dp[i];
                    }
                }
            }

            Console.WriteLine(dp[M]);
        }
Exemple #22
0
        public static void Solve()
        {
            var N = Scanner.Scan <int>();
            var A = Scanner.ScanEnumerable <long>().ToArray();
            var B = Scanner.ScanEnumerable <long>().ToArray();
            var C = A.Zip(B).Select(x => (A: x.First, B: x.Second)).ToArray();

            Array.Sort(C, (x, y) =>
            {
                var ret = x.A.CompareTo(y.A);
                return(ret == 0 ? x.B.CompareTo(y.B) : ret);
            });

            var max = A.Max();
            var dp  = new mint[N + 1, max + 1];

            dp[0, 0] = 1;
            mint answer = 0;

            for (var i = 0; i < N; i++)
            {
                var(a, b) = C[i];
                for (var j = 0; j <= max; j++)
                {
                    dp[i + 1, j] = dp[i, j];
                    if (j - b >= 0)
                    {
                        dp[i + 1, j] += dp[i, j - b];
                    }

                    if (a - b >= j)
                    {
                        answer += dp[i, j];
                    }
                }
            }

            Console.WriteLine(answer);
        }
Exemple #23
0
        public static void Solve()
        {
            var(N, K) = Scanner.Scan <int, int>();
            var dp = new mint[N][].Select(_ => new mint[K]).ToArray();

            Array.Fill(dp[0], 1);
            var pv = Scanner.ScanEnumerable <int>().ToArray();

            for (var i = 1; i < N; i++)
            {
                var v  = Scanner.ScanEnumerable <int>().ToArray();
                var ci = 0;
                for (var j = 0; j < K; j++)
                {
                    for (var k = ci; k < K; k++)
                    {
                        if (pv[j] <= v[k])
                        {
                            dp[i][k] += dp[i - 1][j];
                            ci        = k;
                            break;
                        }
                    }
                }
                for (var j = 0; j < K - 1; j++)
                {
                    dp[i][j + 1] += dp[i][j];
                }
                pv = v;
            }

            mint answer = 0;

            for (var i = 0; i < K; i++)
            {
                answer += dp[N - 1][i];
            }
            Console.WriteLine(answer);
        }
Exemple #24
0
        public static void Solve()
        {
            var(H, W, K)        = Scanner.Scan <int, int, int>();
            var(x1, y1, x2, y2) = Scanner.Scan <int, int, int, int>();
            var dp = new mint[2, 2, 2];

            dp[0, x1 == x2 ? 0 : 1, y1 == y2 ? 0 : 1] = 1;
            var t = 1;

            for (var i = 0; i < K; i++)
            {
                t ^= 1;
                dp[t ^ 1, 0, 0] = dp[t, 0, 1] + dp[t, 1, 0];
                dp[t ^ 1, 0, 1] = dp[t, 0, 0] * (W - 1) + dp[t, 0, 1] * (W - 2) + dp[t, 1, 1];
                dp[t ^ 1, 1, 0] = dp[t, 0, 0] * (H - 1) + dp[t, 1, 0] * (H - 2) + dp[t, 1, 1];
                dp[t ^ 1, 1, 1] = dp[t, 0, 1] * (H - 1) + dp[t, 1, 0] * (W - 1) + dp[t, 1, 1] * (H + W - 4);
            }

            var answer = dp[t ^ 1, 0, 0];

            Console.WriteLine(answer);
        }
Exemple #25
0
        public static void Solve()
        {
            var N = Scanner.Scan <int>();
            var D = new long[N].Select(_ => Scanner.Scan <long>()).ToArray();

            Array.Sort(D);
            var dp = new mint[(int)1e5 + 1, 4];

            for (var i = 0; i < N; i++)
            {
                dp[i + 1, 0] = dp[i, 0] + 1;
                for (var j = 1; j < 4; j++)
                {
                    var k = UpperBound(D, D[i] / 2);
                    dp[i + 1, j] = dp[i, j] + dp[k, j - 1];
                }
            }

            var answer = dp[N, 3];

            Console.WriteLine(answer);
        }
Exemple #26
0
        public static void Solve()
        {
            var(N, M, K) = Scanner.Scan <int, int, int>();
            var G = new List <int> [N].Select(x => new List <int>()).ToArray();

            for (var i = 0; i < M; i++)
            {
                var(u, v) = Scanner.Scan <int, int>();
                u--; v--;
                G[u].Add(v);
                G[v].Add(u);
            }

            var dp = new mint[K + 1, N];

            dp[0, 0] = 1;

            for (var k = 0; k < K; k++)
            {
                mint s = 0;
                for (var u = 0; u < N; u++)
                {
                    s += dp[k, u];
                }
                for (var u = 0; u < N; u++)
                {
                    dp[k + 1, u] = s - dp[k, u];
                    foreach (var v in G[u])
                    {
                        dp[k + 1, u] -= dp[k, v];
                    }
                }
            }

            var answer = dp[K, 0];

            Console.WriteLine(answer);
        }
Exemple #27
0
        public static void Solve()
        {
            var N = Scanner.Scan <long>();
            // x^2 - y = z^2
            // (x + z)(x - z) = y
            // p = x + z
            // q = x - z
            // x = (p + q) / 2
            // z = (p - q) / 2
            // pq <= N
            // p > 0 && q > 0 p >= q

            mint answer = 0;

            for (var q = 1L; q *q <= N; q++)
            {
                var p = N / q;
                var z = (p - q) / 2;
                answer += z + 1; // +0
            }

            Console.WriteLine(answer);
        }
Exemple #28
0
        public static void Solve()
        {
            var N = Scanner.Scan <int>();
            var S = Scanner.Scan <string>();

            var count = new int[26];

            Array.Fill(count, 1);
            foreach (var c in S)
            {
                count[c - 'a']++;
            }

            mint answer = 1;

            foreach (var c in count)
            {
                answer *= c;
            }
            answer--;

            Console.WriteLine(answer);
        }
Exemple #29
0
        public static void Solve()
        {
            var N  = Scanner.Scan <int>();
            var NN = N * N;

            var fact  = new mint[NN + 1];
            var ifact = new mint[NN + 1];

            fact[0] = ifact[0] = 1;
            for (var i = 1; i <= NN; i++)
            {
                fact[i]  = fact[i - 1] * i;
                ifact[i] = 1 / fact[i];
            }

            mint Permutation(int n, int k)
            {
                if (n < k || n < 0 || k < 0)
                {
                    return(0);
                }
                return(fact[n] * ifact[n - k]);
            }

            mint Combination(int n, int k)
            {
                if (n < k || n < 0 || k < 0)
                {
                    return(0);
                }
                return(fact[n] * ifact[k] * ifact[n - k]);
            }

            var answer = fact[NN] - Combination(NN, 2 * N - 1) * fact[N - 1] * fact[N - 1] * fact[(N - 1) * (N - 1)] * NN;

            Console.WriteLine(answer);
        }
Exemple #30
0
        public static void Solve()
        {
            var N  = Scanner.Scan <int>();
            var A  = Scanner.ScanEnumerable <int>().ToArray();
            var p2 = new mint[N + 1];

            p2[0] = 1;
            for (var i = 0; i < N; i++)
            {
                p2[i + 1] = p2[i] * 2;
            }

            var pi2 = new mint[N + 1];

            pi2[N] = p2[N].Inverse();
            for (var i = N; i > 0; i--)
            {
                pi2[i - 1] = pi2[i] * 2;
            }

            var B = A.Distinct().ToArray();

            Array.Sort(B);
            var  map    = B.Select((x, i) => (x, i)).ToDictionary(k => k.x, k => k.i);
            var  M      = map.Count;
            var  ft     = new FenwickTree(M);
            mint answer = 0;

            for (var i = 0; i < N; i++)
            {
                var a = map[A[i]];
                answer += ft.Sum(a + 1) * p2[i];
                ft.Add(a, pi2[i + 1]);
            }

            Console.WriteLine(answer);
        }