constint MAXN = 2E5 + 5; constint MOD = 1E9 + 7; int n, m, T;
signedmain(){ ios::sync_with_stdio(false); cin >> n >> m; set<int> s; s.insert(n); s.insert(0); for (int i = 1; i <= m; i++) { int c, x; cin >> c >> x; if (c == 1) { s.insert(x); } else { auto it = s.lower_bound(x); int r = *it; int l = *(--it); cout << r - l << endl; } } return0; }
constint MAXN = 4E2 + 5; constint MOD = 998244353; int n, m, T; LL dp[MAXN][MAXN], fac[MAXN * 2], inv[MAXN * 2]; bool good[MAXN][MAXN];
LL qpow(LL a, LL b, LL MOD){ LL ans = 1, base = a % MOD; while (b) { if (b & 1) ans = ans * base % MOD; b >>= 1, base = base * base % MOD; } return ans; }
voidadd(LL& a, LL b){ a = (a + b) % MOD; }
voidinit(){ fac[0] = inv[0] = 1; for (int i = 1; i <= n * 2; i++) { fac[i] = fac[i - 1] * i % MOD; inv[i] = qpow(fac[i], MOD - 2, MOD); } }
LL C(int n, int m){ return fac[n] * inv[m] % MOD * inv[n - m] % MOD; }
signedmain(){ ios::sync_with_stdio(false); cin >> n >> m; n *= 2; init(); for (int i = 1; i <= m; i++) { int a, b; cin >> a >> b; good[a][b] = 1; } for (int i = 1; i <= n; i++) { if (good[i][i + 1]) dp[i][i + 1] = 1; dp[i][i - 1] = 1; }
for (int len = 4; len <= n; len += 2) for (int l = 1; l + len - 1 <= n; l++) { int r = l + len - 1; if (good[l][r]) add(dp[l][r], dp[l + 1][r - 1]); for (int k = l + 1; k <= r - 2; k += 2) { int x = (k - l + 1) / 2, y = (r - k) / 2; if (good[l][k]) add(dp[l][r], dp[l + 1][k - 1] * dp[k + 1][r] % MOD * C(y + x, x) % MOD); } } cout << dp[1][n]; return0; }
设 dp[i][j] 表示考虑前 i 个元素,分了 j 组,各组内元素对 M 取模的结果互不相同的方案数。显然,我们此时最多分 i 组,最少分 ⌊M(i+M−1)⌋ 组,因为 [1...i] 与 i 模 M 同余的数有 ⌊M(i+M−1)⌋ 个。对于第 i 个元素,我们要么将其单独分一组,此时有 dp[i][j]←dp[i−1][j−1];要么将其分到已有的 j 组中,但这些组中不能有与之同余的元素,这样的组有 j−⌊Mi−1⌋ 个,因此有 dp[i][j]←dp[i−1][j]∗(j−⌊Mi−1⌋)。初始条件为 dp[0][0]=1。
constint MAXN = 5E3 + 5; constint MOD = 998244353; int n, m, T; LL dp[MAXN][MAXN];
voidadd(LL& a, LL b){ a = (a + b) % MOD; }
signedmain(){ ios::sync_with_stdio(false); cin >> n >> m; dp[0][0] = 1; for (int i = 1; i <= n; i++) { int mi = (i + m - 1) / m; for (int k = mi; k <= i; k++) { if (k <= i - 1) add(dp[i][k], dp[i - 1][k] * (k - (i - 1) / m) % MOD); add(dp[i][k], dp[i - 1][k - 1]); } } for (int i = 1; i <= n; i++) cout << dp[n][i] << "\n"; return0; }