Exemplo n.º 1
0
    static void Main()
    {
        var n  = int.Parse(Console.ReadLine());
        var mc = new MCombination(n);

        Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput())
        {
            AutoFlush = false
        });
        for (int k = 1; k <= n; k++)
        {
            var r = 0L;
            for (int a = 1; a <= n; a++)
            {
                var p = n - (k - 1) * (a - 1);
                if (p < a)
                {
                    break;
                }
                r += mc.MNcr(p, a);
            }
            Console.WriteLine(r % M);
        }
        Console.Out.Flush();
    }
Exemplo n.º 2
0
    static void Main()
    {
        var(h, w, n) = Read3();
        var ps = Array.ConvertAll(new bool[n], _ => Read2()).OrderBy(p => p.r).ThenBy(p => p.c).Append((r: h, c: w)).ToArray();

        var mc = new MCombination(h + w);

        long DeltaNcr((int r, int c) p1, (int r, int c) p2) => mc.MNcr(p2.r + p2.c - p1.r - p1.c, p2.r - p1.r);

        var dp = Array.ConvertAll(ps, p => DeltaNcr((1, 1), p));

        for (int i = 0; i <= n; i++)
        {
            for (int j = i + 1; j <= n; j++)
            {
                if (ps[i].c > ps[j].c)
                {
                    continue;
                }
                dp[j] -= dp[i] * DeltaNcr(ps[i], ps[j]);
                dp[j]  = MInt(dp[j]);
            }
        }
        Console.WriteLine(dp[n]);
    }
Exemplo n.º 3
0
    static object Solve()
    {
        var(R, G, B, K) = Read4();
        var(X, Y, Z)    = Read3();

        var mc = new MCombination(R + G + B);
        var rs = new long[R + 1];
        var gs = new long[G + 1];
        var bs = new long[B + 1];

        for (int r = K - Y; r <= R; r++)
        {
            rs[r] = mc.MNcr(R, r);
        }
        for (int g = K - Z; g <= G; g++)
        {
            gs[g] = mc.MNcr(G, g);
        }
        for (int b = K - X; b <= B; b++)
        {
            bs[b] = mc.MNcr(B, b);
        }

        rs = FNTT.Convolution(rs, gs);
        rs = FNTT.Convolution(rs, bs);
        return(rs[K]);
    }
Exemplo n.º 4
0
    static object Solve()
    {
        (int n, long M) = Read2();

        var mc = new MCombination(n + 1, M);

        // 長さ i の区間を j steps でオンにする方法
        var dp2 = new MemoDP2 <long>(n + 1, n + 1, -1, (dp, i, j) =>
        {
            var d = i - j - 1;
            var v = 0L;

            for (int k = 1; k < j; k++)
            {
                v += dp[k + d, k] * dp[j - k, j - k] % M * mc.MNcr(j, k) % M;
            }
            return(v % M);
        });

        for (int i = 0; i <= n; i++)
        {
            for (int j = 0; i >= 2 * j; j++)
            {
                dp2[i, j] = 0;
            }
        }

        dp2[1, 1] = 1;
        for (int i = 1; i < n; i++)
        {
            dp2[i + 1, i + 1] = dp2[i, i] * 2 % M;
        }

        return(Enumerable.Range(1, n).Sum(j => dp2[n, j]) % M);
    }
Exemplo n.º 5
0
    static object Solve()
    {
        var(n, k) = Read2();

        var mc = new MCombination(n);

        var r = 0L;

        Partition(n, p =>
        {
            var lcm  = 1;
            var comb = 1L;
            var rem  = n;

            // LINQ を使わなければ高速化できます。
            var g = p.GroupBy(v => v).Select(g => mc.MInvFactorial(g.Count())).Aggregate((x, y) => x * y % M);

            foreach (var v in p)
            {
                lcm  = Lcm(lcm, v);
                comb = comb * mc.MNcr(rem, v) % M * mc.MFactorial(v - 1) % M;
                rem -= v;
            }

            r += MPow(lcm, k) * comb % M * g % M;
        });

        return(r % M);
    }
Exemplo n.º 6
0
    static void Main()
    {
        var(n, k) = Read2();
        var a = Array.ConvertAll(new bool[n], _ => Read());

        var r    = 1L;
        var rn   = Enumerable.Range(0, n).ToArray();
        var comb = new MCombination(n);

        var ufi = new UF(n);

        for (int i1 = 0; i1 < n; i1++)
        {
            for (int i2 = i1 + 1; i2 < n; i2++)
            {
                if (rn.All(j => a[i1][j] + a[i2][j] <= k))
                {
                    ufi.Unite(i1, i2);
                }
            }
        }

        var ufj = new UF(n);

        for (int j1 = 0; j1 < n; j1++)
        {
            for (int j2 = j1 + 1; j2 < n; j2++)
            {
                if (rn.All(i => a[i][j1] + a[i][j2] <= k))
                {
                    ufj.Unite(j1, j2);
                }
            }
        }

        foreach (var g in ufi.ToGroups())
        {
            r *= comb.MFactorial(g.Length);
            r %= M;
        }
        foreach (var g in ufj.ToGroups())
        {
            r *= comb.MFactorial(g.Length);
            r %= M;
        }
        Console.WriteLine(r);
    }
Exemplo n.º 7
0
    static object Solve()
    {
        var(n, m) = Read2();
        var es = Array.ConvertAll(new bool[m], _ => Read2());

        var u = new bool[2 * n, 2 * n];

        foreach (var(a, b) in es)
        {
            u[a - 1, b - 1] = true;
            u[b - 1, a - 1] = true;
        }

        var mc = new MCombination(n);

        var dp = NewArray2(2 * n + 1, 2 * n + 1, -1L);

        return(Rec(0, 2 * n));

        long Rec(int l, int r)
        {
            if (dp[l][r] != -1)
            {
                return(dp[l][r]);
            }
            if (l == r)
            {
                return(dp[l][r] = 1);
            }

            var v = 0L;

            for (int c = l + 2; c <= r; c += 2)
            {
                if (u[l, c - 1])
                {
                    v += Rec(l + 1, c - 1) * Rec(c, r) % M * mc.MNcr((r - l) / 2, (r - c) / 2);
                    v %= M;
                }
            }
            return(dp[l][r] = v);
        }
    }
Exemplo n.º 8
0
    static object Solve()
    {
        var(n, m) = Read2();
        var ps = Array.ConvertAll(new bool[m], _ => Read3());

        var n2 = 2 * n;
        var mc = new MCombination(n2);
        var r  = n2 * mc.MNcr(n2, n) % M;

        foreach (var(t, x, y) in ps)
        {
            if (t == 1)
            {
                r -= mc.MNcr(x + y, x) * mc.MNcr(n2 - x - y - 1, n - y) % M;
            }
            else
            {
                r -= mc.MNcr(x + y, x) * mc.MNcr(n2 - x - y - 1, n - x) % M;
            }
        }

        return(MInt(r));
    }
Exemplo n.º 9
0
    static object Solve()
    {
        var(R, G, B, K) = Read4();
        var(X, Y, Z)    = Read3();

        var c  = 0L;
        var mc = new MCombination(R + G + B);

        for (int r = 0; r <= R; r++)
        {
            for (int g = 0; g <= G && g <= K - r; g++)
            {
                var b = K - r - g;
                if (b > B)
                {
                    continue;
                }

                if (r + g > X)
                {
                    continue;
                }
                if (g + b > Y)
                {
                    continue;
                }
                if (b + r > Z)
                {
                    continue;
                }

                c += mc.MNcr(R, r) * mc.MNcr(G, g) % M * mc.MNcr(B, b);
                c %= M;
            }
        }
        return(c);
    }
Exemplo n.º 10
0
    static object Solve()
    {
        var(n, m) = Read2();
        var es = Array.ConvertAll(new bool[m], _ => Read2());

        var u = new bool[2 * n, 2 * n];

        foreach (var(a, b) in es)
        {
            u[a - 1, b - 1] = true;
            u[b - 1, a - 1] = true;
        }

        var mc = new MCombination(n);

        var dp2 = new MemoDP2 <long>(2 * n + 1, 2 * n + 1, -1, (dp, l, r) =>
        {
            var v = 0L;

            for (int c = l + 2; c <= r; c += 2)
            {
                if (u[l, c - 1])
                {
                    v += dp[l + 1, c - 1] * dp[c, r] % M * mc.MNcr((r - l) / 2, (r - c) / 2);
                    v %= M;
                }
            }
            return(v);
        });

        for (int i = 0; i <= 2 * n; i++)
        {
            dp2[i, i] = 1;
        }
        return(dp2[0, 2 * n]);
    }
Exemplo n.º 11
0
    static object Solve()
    {
        var(n, m) = Read2();

        // TLE
        var qs = new int[m];

        for (int i = 0; i < n; i++)
        {
            qs[i % m]++;
        }

        var mc = new MCombination(n + 1);

        var dp = NewArray2 <long>(m + 1, n + 1);

        dp[0][0] = 1;

        for (int i = 1; i <= m; i++)
        {
            var q = qs[i - 1];
            for (int j = 0; j <= n; j++)
            {
                for (int k = 0; k <= j; k++)
                {
                    var d = j - k;
                    if (d <= q && q <= j)
                    {
                        dp[i][j] += dp[i - 1][k] * mc.MNcr(q, d) % M * mc.MNpr(k, q - d);
                        dp[i][j] %= M;
                    }
                }
            }
        }

        return(string.Join("\n", dp[^ 1][1..]));