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(); }
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]); }
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]); }
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); }
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); }
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); }
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); } }
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)); }
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); }
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]); }
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..]));