CF367E 题解
有
n 个区间,你需要为每个区间分配左右端点l ,r (1 \le l \le r \le m ),使得区间两两互不包含且至少存在一个区间的左端点等于x ,输出方案数对10^9 + 7 取模的结果。
若
考虑确定了
这样问题转换为选出
转移很简单,四种情况:
#include <bits/stdc++.h>
using namespace std;
inline int read() {
int x = 0, f = 0; char c = 0;
while (!isdigit(c)) f |= c == '-', c = getchar();
while (isdigit(c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
return f ? -x : x;
}
#define N 320
#define P 1000000007
#define int long long
int n, m, x, f[N][N];
signed main() {
n = read(), m = read(), x = read();
if (n > m) return puts("0"), 0;
memset(f, 0, sizeof f), f[0][0] = 1;
for (int i = 1; i <= m; i ++) {
for (int j = n; j >= 0; j --) {
for (int k = j; k >= 0; k --) {
if (i == x) f[j][k] = 0;
if (j > 0) (f[j][k] += f[j - 1][k]) %= P;
if (i != x && k > 0) (f[j][k] += f[j][k - 1]) %= P;
if (j > 0 && k > 0) (f[j][k] += f[j - 1][k - 1]) %= P;
}
}
}
int res = f[n][n];
for (int i = 1; i <= n; i ++) {
(res *= i) %= P;
}
printf("%lld\n", res);
return 0;
}
update: 数据范围已更正,感谢提醒