ARC096E Everything on It 题解
题意
- 有一个包含 个元素的集合 。
- 你要选择若干个互不相同的 的子集,使得每个元素至少出现两次,求方案数。
- ,答案对 取模。
题解
考虑容斥,设 表示有至少 个数出现了最多一次,则答案为 。
枚举这 个数被划分到 个集合中。由于可能有一些数没有出现过,因此我们可以新增一个数 ,将这 个数划分到 个集合中,与 在同一集合的数没有出现过,这部分方案数为 。
考虑剩下 个数,首先存在 个集合可选可不选,方案数为 ,然后之前的 个中每个集合又可以与这 个集合并起来,方案数为 。
因此 ,最终的答案可以 计算。
代码
const int N = 3e3 + 7;
int n;
modint s[N][N], ans;
inline modint f(int i) {
modint w = (modint)2 ^ (n - i), o = 1, ret = 0;
for (int j = 0; j <= i; j++, o *= w)
ret += s[i+1][j+1] * o;
--P, w = (modint)2 ^ (n - i), ++P;
return ret * ((modint)2 ^ w.x);
}
int main() {
rd(n, P);
init(n);
s[0][0] = 1;
for (int i = 1; i <= n + 1; i++)
for (int j = 0; j <= i; j++)
s[i][j] = (j ? s[i-1][j-1] : 0) + j * s[i-1][j];
for (int i = 0; i <= n; i++)
if (i & 1) ans -= binom(n, i) * f(i);
else ans += binom(n, i) * f(i);
print(ans);
return 0;
}
评论
暂无已公开评论。