public void Solve() { var n = ri; var a = Enumerate(n + 1, x => ri); var cnt = new int[n + 5]; foreach (var x in a) { cnt[x]++; } var v = -1; for (int i = 0; i <= n; i++) { if (cnt[i] == 2) { v = i; } } var p = -1; var q = -1; for (int i = 0; i <= n; i++) { if (a[i] == v) { if (p == -1) { p = i; } else { q = i; } } } var span = q - p - 1; var table = new ModTable(n + 50); for (int i = 1; i <= n + 1; i++) { if (i == 1) { IO.Printer.Out.WriteLine(n); } else { ModInt ans = 0; ans += table.Combination(n - 1, i - 2); ans += table.Combination(n - 1, i); ans += 2 * table.Combination(n - 1, i - 1); ans -= table.Combination(n - 1 - span, i - 1); IO.Printer.Out.WriteLine(ans); } } }
public void Solve() { var n = sc.Integer(); var m = sc.Integer(); if (m == 1) { IO.Printer.Out.WriteLine(1); return; } var table = new ModTable(2001 * 2001); var dp = Enumerate(n + 2, x => new ModInteger[n + 2]); dp[0][0] = 1; for (int i = 0; i <= n; i++) { for (int j = 0; j <= n; j++) { var rem = n - i + (m - 1) * (n - j); dp[i + 1][j] += dp[i][j]; if (j + 1 <= i) { dp[i][j + 1] += dp[i][j] * table.Combination(rem - 1, (m - 2)); } } } IO.Printer.Out.WriteLine(dp[n][n] * table.perm[n]); }
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); }
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]); }