Exemple #1
0
        public void Solve()
        {
            var n = sc.Integer();
            var G = Enumerate(n, x => new List <int>());

            for (int i = 0; i < n - 1; i++)
            {
                var f = sc.Integer() - 1;
                var t = sc.Integer() - 1;
                G[f].Add(t);
                G[t].Add(f);
            }
            Func <int, int, ModInteger[]> dfs = null;

            dfs = (prev, cur) =>
            {
                var ret = new ModInteger[2] {
                    1, 1
                };
                foreach (var to in G[cur])
                {
                    if (prev == to)
                    {
                        continue;
                    }
                    var res = dfs(cur, to);
                    ret[0] *= res[0] + res[1];
                    ret[1] *= res[0];
                }
                return(ret);
            };
            var ans = dfs(-1, 0);

            IO.Printer.Out.WriteLine(ans[0] + ans[1]);
        }
Exemple #2
0
        public void Solve()
        {
            var n = sc.Integer();
            var s = sc.Scan();
            //const int MOD = (int)ModInteger.Mod;
            var dp = new ModInteger[n + 1];

            dp[0] = 1;
            for (int _ = 0; _ < n; _++)
            {
                var next = new ModInteger[n + 1];
                for (int i = 0; i < n; i++)
                {
                    next[i + 1] += dp[i];
                    //if (next[i + 1] >= MOD) next[i + 1] -= MOD;
                    next[i + 1] += dp[i];
                    //if (next[i + 1] >= MOD) next[i + 1] -= MOD;
                    var p = Math.Max(0, i - 1);
                    next[p] += dp[i];
                    //if (next[p] >= MOD) next[p] -= MOD;
                }
                dp = next;
            }
            ModInteger res = dp[s.Length];
            var        k   = ModInteger.Pow(2, s.Length);

            res *= ModInteger.Pow(k, ModInteger.Mod - 2);
            IO.Printer.Out.WriteLine(res);
        }
Exemple #3
0
        public void Solve()
        {
            var a = sc.Long();
            var b = sc.Long();

            ModInteger.Mod = sc.Integer();
            var mat = new ModMatrix(2, 2);

            mat[0, 0] = 10;
            mat[0, 1] = 1;
            mat[1, 1] = 1;
            var vec = new ModMatrix(2, 1);

            vec[0, 0] = 1;
            vec[0, 1] = 1;

            var gcd = MathEx.GCD(a, b);
            var A   = (ModMatrix.Pow(mat, a - 1) * vec)[0, 0];

            mat[0, 0] = ModInteger.Pow(10, gcd);

            var B = (ModMatrix.Pow(mat, b / gcd - 1) * vec)[0, 0];

            IO.Printer.Out.WriteLine(A * B);
            //IO.Printer.Out.WriteLine(A * B * ModInteger.Inverse(GCD));
        }
Exemple #4
0
        public void Solve()
        {
            var n = sc.Integer();
            var s = sc.Scan();

            var dp   = new ModInteger[n + 1];
            var next = new ModInteger[n + 1];

            dp[0] = 1;
            for (int _ = 0; _ < n; _++)
            {
                for (int i = 0; i < n; i++)
                {
                    next[i + 1] += dp[i];
                    next[i + 1] += dp[i];
                    next[Math.Max(0, i - 1)] += dp[i];
                }
                for (int i = 0; i <= n; i++)
                {
                    dp[i]   = next[i];
                    next[i] = 0;
                }
            }
            var res = dp[s.Length];
            var k   = ModInteger.Pow(2, s.Length);

            res *= ModInteger.Pow(k, ModInteger.Mod - 2);
            IO.Printer.Out.WriteLine(res);
        }
Exemple #5
0
    public static ModInteger operator -(ModInteger l, ModInteger r)
    {
        var n = new ModInteger(); n.num = l.num + Mod - r.num; if (n.num >= Mod)

        {
            n.num -= Mod;
        }
        return(n);
    }
Exemple #6
0
        public void Solve()
        {
            var n   = sc.Integer();
            var m   = sc.Integer();
            var max = Enumerate(n, x => x);
            var s   = sc.Scan();

            for (int i = 0; i < m; i++)
            {
                var l = sc.Integer() - 1;
                var r = sc.Integer() - 1;
                max[l] = Math.Max(max[l], r);
            }
            for (int i = 1; i < n; i++)
            {
                max[i] = Math.Max(max[i], max[i - 1]);
            }
            var dp = new ModInteger[n + 1];

            dp[0] = 1;
            var a = 0; var b = 0;

            for (int i = 0, r = 0; i < n; i++)
            {
                while (r <= max[i])
                {
                    if (s[r] == '0')
                    {
                        a++;
                    }
                    else
                    {
                        b++;
                    } r++;
                }
                var next = new ModInteger[n + 1];
                for (int j = 0; j <= n; j++)
                {
                    if (dp[j].num == 0)
                    {
                        continue;
                    }
                    if (j + 1 <= a)
                    {
                        next[j + 1] += dp[j];
                    }
                    var k = i - j;
                    if (k + 1 <= b)
                    {
                        next[j] += dp[j];
                    }
                }
                dp = next;
            }
            IO.Printer.Out.WriteLine(dp[a]);
        }
Exemple #7
0
    public static ModInteger operator +(ModInteger l, ModInteger r)
    {
        var n = new ModInteger()
        {
            num = l.num + r.num
        }; if (n.num >= Mod)

        {
            n.num -= Mod;
        }
        return(n);
    }
Exemple #8
0
    public static ModInteger Pow(ModInteger v, long k)
    {
        ModInteger ret = 1;
        var        n   = k;

        for (; n > 0; n >>= 1, v *= v)
        {
            if ((n & 1) == 1)
            {
                ret = ret * v;
            }
        }
        return(ret);
    }
Exemple #9
0
        public void Solve()
        {
            var n = sc.Integer();
            var A = sc.Long();
            var B = sc.Long();
            var a = new BigInteger[n];

            for (int i = 0; i < n; i++)
            {
                a[i] = sc.Long();
            }
            Array.Sort(a);
            if (A == 1)
            {
                for (int i = 0; i < n; i++)
                {
                    IO.Printer.Out.WriteLine(a[i]);
                }
                return;
            }
            while (B > 0)
            {
                if (a[n - 1] < a[0] * A)
                {
                    break;
                }
                a[0] *= A;
                Array.Sort(a);
                Debug.WriteLine(a.AsJoinedString());
                B--;
            }
            Debug.WriteLine(B);
            var k   = B / n;
            var rem = B % n;

            while (rem > 0)
            {
                a[0] *= A;
                Array.Sort(a);
                rem--;
            }
            for (int i = 0; i < n; i++)
            {
                var v = a[i] % 1000000007;
                v = (v * ModInteger.Pow(A, k).num) % 1000000007;
                IO.Printer.Out.WriteLine(v);
            }
        }
Exemple #10
0
 public ModTable(int n)
 {
     perm    = new ModInteger[n + 1];
     inv     = new ModInteger[n + 1];
     perm[0] = 1;
     for (int i = 1; i <= n; i++)
     {
         perm[i] = perm[i - 1] * i;
     }
     inv[n] = ModInteger.Inverse(perm[n]);
     for (int i = n - 1; i >= 0; i--)
     {
         inv[i] = inv[i + 1] * (i + 1);
     }
     inv[0] = inv[1];
 }
Exemple #11
0
        public void Solve()
        {
            var       n   = sc.Integer();
            var       A   = new int[n];
            var       B   = new int[n];
            const int ADD = 2100;
            var       dp  = Enumerate(4200, x => new ModInteger[4200]);

            for (int i = 0; i < n; i++)
            {
                A[i] = sc.Integer();
                B[i] = sc.Integer();
                dp[ADD - A[i]][ADD - B[i]] += 1;
            }
            for (int i = 1; i < 4200; i++)
            {
                for (int j = 1; j < 4200; j++)
                {
                    dp[i][j] += dp[i - 1][j] + dp[i][j - 1];
                }
            }
            ModInteger sum = 0;

            for (int i = 0; i < n; i++)
            {
                sum += dp[ADD + A[i]][ADD + B[i]];
            }


            var fact = new ModInteger[8200];
            var inv  = new ModInteger[8200];

            fact[0] = inv[0] = 1;
            for (int i = 1; i < 8200; i++)
            {
                fact[i] = fact[i - 1] * i;
                inv[i]  = ModInteger.Inverse(fact[i]);
            }
            for (int i = 0; i < n; i++)
            {
                sum -= fact[2 * A[i] + 2 * B[i]] * inv[2 * A[i]] * inv[2 * B[i]];
            }


            sum *= ModInteger.Inverse(2);
            IO.Printer.Out.WriteLine(sum);
        }
Exemple #12
0
        public void Solve()
        {
            var n     = sc.Integer();
            var a     = sc.Integer();
            var b     = sc.Integer();
            var c     = sc.Integer();
            var d     = sc.Integer();
            var table = new ModTable(2 * n);
            var dp    = new ModInteger[n + 1];

            dp[0] = 1;
            for (int sz = a; sz <= b; sz++)
            {
                var next = new ModInteger[n + 1];
                for (int i = 0; i <= n; i++)
                {
                    if (dp[i].num == 0)
                    {
                        continue;
                    }

                    ModInteger all  = 1;
                    var        size = i;
                    for (int k = 1; k <= d; k++)
                    {
                        size += sz;
                        if (size > n)
                        {
                            break;
                        }
                        all *= table.Combination(n - size + sz, sz);
                        if (c <= k && k <= d)
                        {
                            next[size] += dp[i] * all * table.invp[k];
                        }
                    }
                }

                for (int j = 0; j <= n; j++)
                {
                    dp[j] += next[j];
                }
                //Debug.WriteLine(dp.AsJoinedString());
            }
            IO.Printer.Out.WriteLine(dp[n]);
        }
Exemple #13
0
        ModInteger f(int[] a)
        {
            var        n   = a.Length;
            ModInteger ret = 0;
            var        d   = new ModInteger[n - 1];

            for (int i = 0; i < n - 1; i++)
            {
                d[i] = a[i + 1] - a[i];
            }
            for (int i = 0; i < n - 1; i++)
            {
                var l = i + 1;
                var r = n - l;
                ret += d[i] * l * r;
            }
            return(ret);
        }
Exemple #14
0
        ModInteger f(int n, int m)
        {
            this.n = n; this.m = m;
            dp     = new ModInteger[m, n + 1];
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n + 1; j++)
                {
                    dp[i, j].num = -1;
                }
            }
            ModInteger ans = 0;

            for (int i = 0; i <= n; i++)
            {
                ans += dfs(0, i);
            }
            return(ans);
        }
Exemple #15
0
        public void Solve()
        {
            var        n    = sc.Integer();
            var        s    = sc.Scan();
            const long MOD  = ModInteger.Mod;
            var        dp   = new long[n + 1];
            var        next = new long[n + 1];

            dp[0] = 1;
            for (int _ = 0; _ < n; _++)
            {
                for (int i = 0; i < n; i++)
                {
                    next[i + 1] += dp[i];
                    if (next[i + 1] >= MOD)
                    {
                        next[i + 1] -= MOD;
                    }
                    next[i + 1] += dp[i];
                    if (next[i + 1] >= MOD)
                    {
                        next[i + 1] -= MOD;
                    }
                    var p = Math.Max(0, i - 1);
                    next[p] += dp[i];
                    if (next[p] >= MOD)
                    {
                        next[p] -= MOD;
                    }
                }
                for (int i = 0; i <= n; i++)
                {
                    dp[i]   = next[i];
                    next[i] = 0;
                }
            }
            ModInteger res = dp[s.Length];
            var        k   = ModInteger.Pow(2, s.Length);

            res *= ModInteger.Pow(k, ModInteger.Mod - 2);
            IO.Printer.Out.WriteLine(res);
        }
Exemple #16
0
        public void Solve()
        {
            var n  = sc.Integer();
            var c  = sc.Integer();
            var a  = sc.Integer(n);
            var b  = sc.Integer(n);
            var dp = new ModInteger[c + 1];

            dp[0] = 1;

            var range = new ModInteger[420, 420];

            for (int i = 1; i < 420; i++)
            {
                range[i, 0] = 1;
                for (int k = 1; k < 420; k++)
                {
                    range[i, k] = range[i, k - 1] * i;
                }
            }
            for (int k = 0; k < 420; k++)
            {
                for (int i = 1; i < 420; i++)
                {
                    range[i, k] += range[i - 1, k];
                }
            }
            for (int i = 0; i < n; i++)
            {
                var next = new ModInteger[c + 1];
                for (int j = 0; j <= c; j++)
                {
                    for (int l = 0; j + l <= c; l++)
                    {
                        next[j + l] += dp[j] * (range[b[i], l] - range[a[i] - 1, l]);
                    }
                }
                dp = next;
            }
            IO.Printer.Out.WriteLine(dp[c]);
        }
Exemple #17
0
        public void Solve()
        {
            var n     = sc.Integer();
            var m     = sc.Integer();
            var k     = sc.Integer();
            var table = new ModTable(n + m + k + 1);

            ModInteger ans = 0;
            ModInteger C   = 1;
            var        l   = 0;
            var        r   = 0;

            for (int i = n; i <= n + m + k; i++)
            {
                var a = table.Combination(i - 1, n - 1);
                a   *= ModInteger.Pow(3, n + m + k - i);
                a   *= C;
                ans += a;
                C   *= 2;
                var rem = i - n + 1;
                Debug.WriteLine("{0} {1}", l, r);
                var nl = Math.Max(0, rem - k);
                var nr = Math.Min(m, rem);
                if (l != nl)
                {
                    C -= table.Combination(i - n, l);
                }
                if (r == nr)
                {
                    C -= table.Combination(i - n, r);
                }
                else if (r > nr)
                {
                    C -= table.Combination(i - n, r) * 2;
                }
                l = nl;
                r = nr;
            }
            IO.Printer.Out.WriteLine(ans);
        }
Exemple #18
0
        public void Solve()
        {
            var        n   = sc.Integer();
            var        k   = sc.Integer();
            ModInteger ans = 0;
            var        div = MathEx.GetDivisors(n);
            var        dp  = new ModInteger[div.Count];

            for (int i = 0; i < div.Count; i++)
            {
                if (n % 2 == 0)
                {
                    dp[i] += ModInteger.Pow(k, div[i]);
                }
                else
                {
                    dp[i] += ModInteger.Pow(k, div[i] / 2 + 1);
                }
                for (int j = 0; j < i; j++)
                {
                    if (div[i] % div[j] == 0)
                    {
                        dp[i] -= dp[j];
                    }
                }
                if (n % 2 == 0 && (n / div[i]) % 2 == 0)
                {
                    ans += dp[i] * div[i];
                }
                if (n % 2 == 1)
                {
                    ans += dp[i] * div[i];
                }
            }
            Debug.WriteLine(dp.AsJoinedString());
            //naive(n, k);
            IO.Printer.Out.WriteLine(ans);
        }
Exemple #19
0
        public void Solve()
        {
            var n = sc.Integer();
            var l = sc.Long(n).Distinct().ToArray();

            Array.Sort(l);
            var ans = ModInteger.Pow(2, l[0]);
            var gcd = 0L;

            foreach (var x in l.Skip(1).Select(x => x - l[0]))
            {
                if (gcd == 0)
                {
                    gcd = x;
                }
                else
                {
                    gcd = MathEx.GCD(gcd, x);
                }
            }
            ans *= ModInteger.Pow(2, (gcd + 1) / 2);
            IO.Printer.Out.WriteLine(ans);
        }
Exemple #20
0
        ModInteger dfs(int i, int j)
        {
            if (i == m)
            {
                return(1);
            }
            if (dp[i, j].num != -1)
            {
                return(dp[i, j]);
            }
            ModInteger ret = 0;
            var        k   = n - j;

            if (j > 0)
            {
                ret += dfs(i + 1, j - 1) + dfs(i + 1, j);
            }
            if (k > 0)
            {
                ret += dfs(i + 1, j + 1) + dfs(i + 1, j);
            }
            return(dp[i, j] = ret);
        }
Exemple #21
0
        public void Solve()
        {
            var n   = sc.Integer();
            var ep  = new ModInteger[n + 50];
            var cum = new ModInteger[n + 50];

            for (int i = 0; i <= n; i++)
            {
                ep[i].num = -1;
            }
            ep[0] = 1;
            ep[1] = n;
            Func <int, ModInteger> dfs = null;

            dfs = m =>
            {
                //Debug.WriteLine(m);
                if (m < 0)
                {
                    return(1);
                }
                if (ep[m].num != -1)
                {
                    return(ep[m]);
                }
                ModInteger ret = 0;
                for (int i = 1; i <= n; i++)
                {
                    //1
                    if (i == 1)
                    {
                        ret += dfs(m - i);
                    }
                    else
                    {
                        ret += dfs(m - i - 1);
                    }
                    if (i != 1)
                    {
                        ret += n - 1;
                    }
                }
                return(ep[m] = ret);
            };
            dfs(2);
            //Debug.WriteLine(dfs(n));

            ep[0]  = 1;
            ep[1]  = n;
            cum[0] = ep[0];
            cum[1] = ep[0] + ep[1];
            cum[2] = cum[1] + ep[2];

            for (int m = 3; m <= n; m++)
            {
                ModInteger ret = 0;
                ret += ep[m - 1];
                ret += cum[m - 3];
                ret += n - m + 1;

                ModInteger val = n - 1; val *= n - 1;
                ret   += val;
                ep[m]  = ret;
                cum[m] = cum[m - 1] + ep[m];
            }
            //Debug.WriteLine(ep.AsJoinedString());
            IO.Printer.Out.WriteLine(ep[n]);
        }
Exemple #22
0
        public void Solve()
        {
            var n       = sc.Integer();
            var a       = sc.Integer(n);
            var RG      = Enumerate(n, x => new List <int>());
            var RA      = Enumerate(n, x => - 1);
            var size    = new int[n];
            var iscycle = Enumerate(n, x => true);
            var s       = new DisjointSet(n);
            var t       = new DisjointSet(n);
            {
                var d = new int[n];
                var g = Enumerate(n, x => new List <int>());
                for (int i = 0; i < n; i++)
                {
                    a[i]--;
                    g[i].Add(a[i]);
                    RG[a[i]].Add(i);
                    s.Unite(i, a[i]);
                    d[a[i]]++;
                }
                if (d.Any(x => x >= 3))
                {
                    Debug.WriteLine("hoge");
                    IO.Printer.Out.WriteLine(0); return;
                }
                foreach (var x in Graph.TopologicalSort(g))
                {
                    iscycle[x] = false;
                }
                for (int i = 0; i < n; i++)
                {
                    if (iscycle[i] && iscycle[a[i]])
                    {
                        t.Unite(i, a[i]);
                        RA[a[i]] = i;
                    }
                    if (!iscycle[i] && !iscycle[a[i]])
                    {
                        t.Unite(i, a[i]);
                    }
                }
                for (int i = 0; i < n; i++)
                {
                    if (!iscycle[i] && RG[i].Count > 1)
                    {
                        Debug.WriteLine("turai");
                        IO.Printer.Out.WriteLine(0);
                        return;
                    }
                }
                for (int i = 0; i < n; i++)
                {
                    if (!iscycle[i] && iscycle[a[i]])
                    {
                        size[a[i]] = t.Size(i);
                    }
                }
            }
            ModInteger ans = 1;
            //??: cycle, namori
            var cycle = new int[n + 1];

            {
                var used = new bool[n];
                Func <int, int, int, ModInteger> dfs = null;
                dfs = (cur, sz, d) =>
                {
                    Debug.WriteLine($"{cur} {sz} {d}");
                    if (sz == -1 && size[cur] == 0)
                    {
                        return(dfs(RA[cur], -1, -1));
                    }
                    else if (size[cur] == 0)
                    {
                        used[cur] = true;
                        return(dfs(RA[cur], sz, d + 1));
                    }
                    else
                    {
                        ModInteger ret = 0;
                        if (sz == -1)
                        {
                            ret = 1;
                        }
                        if (sz > d)
                        {
                            ret = 0;
                        }
                        else if (sz == d)
                        {
                            ret = 1;
                        }
                        else
                        {
                            ret = 2;
                        }

                        if (used[cur])
                        {
                            return(ret);
                        }
                        used[cur] = true;

                        ret *= dfs(RA[cur], size[cur], 1);

                        return(ret);
                    }
                };
                for (int i = 0; i < n; i++)
                {
                    if (s[i] == i)
                    {
                        if (s.Size(i) == t.Size(i))
                        {
                            cycle[s.Size(i)]++;
                        }
                    }
                }
                for (int i = 0; i < n; i++)
                {
                    if (s.Size(i) != t.Size(i) && RA[i] != -1 && !used[i])
                    {
                        ans *= dfs(i, -1, -1);
                    }
                }
            }
            //IO.Printer.Out.WriteLine(ans);
            //return;
            //cycle
            for (int i = 0; i <= n; i++)
            {
                if (cycle[i] == 0)
                {
                    continue;
                }
                var k  = cycle[i];
                var dp = new ModInteger[k + 1];
                for (int j = 0; j <= k; j++)
                {
                    dp[j].num = -1;
                }
                Func <int, ModInteger> dfs = null;
                dfs = m =>
                {
                    if (m == 0)
                    {
                        return(1);
                    }
                    else if (m < 0)
                    {
                        return(0);
                    }
                    if (dp[m].num != -1)
                    {
                        return(dp[m]);
                    }
                    var ret = dfs(m - 1);
                    if (i % 2 != 0 && i != 1)
                    {
                        ret *= 2;
                    }
                    ret += dfs(m - 2) * i * (m - 1);
                    return(dp[m] = ret);
                };
                ans *= dfs(k);
            }
            IO.Printer.Out.WriteLine(ans);
        }
Exemple #23
0
 public static ModInteger operator ^(ModInteger l, long r)
 {
     return(ModInteger.Pow(l, r));
 }
Exemple #24
0
        public void Solve()
        {
            var n = ri;
            var m = ri;
            var Q = Enumerate(n + 1, x => new List <KeyValuePair <int, int> >());

            for (int i = 0; i < m; i++)
            {
                var l = ri;
                var r = ri;
                var x = ri;
                Q[r].Add(new KeyValuePair <int, int>(l, x));
            }
            ModInteger ans = 0;
            var        dp  = new int[28372625];

            dp[0] = 1;
            for (int i = 0; i <= n; i++)
            {
                for (int j = i; j <= n; j++)
                {
                    for (int k = j; k <= n; k++)
                    {
                        var s = enc(i, j, k);
                        if (dp[s] == 0)
                        {
                            continue;
                        }
                        //Debug.WriteLine("{0} {1} {2} {3}", i, j, k, dp[i, j, k]);
                        var max = Max(i, Max(j, k));
                        var ok  = true;
                        foreach (var q in Q[max])
                        {
                            var cnt = 0;
                            if (q.Key <= i)
                            {
                                cnt++;
                            }
                            if (q.Key <= j)
                            {
                                cnt++;
                            }
                            if (q.Key <= k)
                            {
                                cnt++;
                            }
                            if (cnt != q.Value)
                            {
                                ok = false;
                                break;
                            }
                        }
                        if (!ok)
                        {
                            continue;
                        }
                        dp[s] %= 1000000007;

                        if (max == n)
                        {
                            ans += dp[s];
                        }
                        dp[enc(j, k, max + 1)] += dp[s];
                        dp[enc(j, k, max + 1)] %= 1000000007;
                        dp[enc(i, k, max + 1)] += dp[s];
                        dp[enc(i, k, max + 1)] %= 1000000007;
                        dp[enc(i, j, max + 1)] += dp[s];
                        dp[enc(i, j, max + 1)] %= 1000000007;
                    }
                }
            }
            IO.Printer.Out.WriteLine(ans);
        }
Exemple #25
0
        public void Solve()
        {
            var n = sc.Integer();
            var k = sc.Integer();
            var a = n / k;
            var b = n % k;

            var fact = new ModInteger[2050];

            for (int i = (int)(fact[0] = 1).num; i < 2050; i++)
            {
                fact[i] = i * fact[i - 1];
            }

            var C = new ModInteger[4050, 4050];

            C[0, 0] = 1;
            for (int i = 0; i < 4010; i++)
            {
                for (int j = 0; j < 4010; j++)
                {
                    C[i + 1, j]     += C[i, j];
                    C[i + 1, j + 1] += C[i, j];
                }
            }

            //dp(i,j) = i ????????? j ????????????
            var dp2 = Enumerate(2050, x => new ModInteger[2050]);

            dp2[0][0] = 1;
            for (int i = 0; i < 2010; i++)
            {
                for (int j = 0; j < 2010; j++)
                {
                    dp2[i + 1][j]     += dp2[i][j];
                    dp2[i + 2][j + 1] += dp2[i][j];
                }
            }
            var dp = new ModInteger[1];

            dp[0] = 1;
            for (int _ = 0; _ < 2; _++)
            {
                for (int mod = 0; mod < k; mod++)
                {
                    var sz = a;
                    if (mod < b)
                    {
                        sz++;
                    }


                    var next = new ModInteger[sz + dp.Length];

                    for (int i = 0; i < dp.Length; i++)
                    {
                        for (int j = 0; j < sz; j++)
                        {
                            next[i + j] += dp[i] * dp2[sz][j];
                        }
                    }

                    dp = next;
                }
            }
            for (int i = n; i >= 0; i--)
            {
                dp[i] *= fact[n - i];
                for (int j = i + 1; j < dp.Length; j++)
                {
                    dp[i] -= C[j, i] * dp[j];
                }
            }
            IO.Printer.Out.WriteLine(dp[0]);
        }