5098 - 子集选取
时间限制 : 1 秒
内存限制 : 256 MB
一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007。
输入
输入一行两个整数N,K。
输出
输出一个整数表示答案。
样例
输入
3 2
输出
6
提示
数据规模和约定
1 <= K <= N <= 10 ^ 6。
锦囊1
将第一个集合特别考虑,问题转换后,利用容斥原理计算。
锦囊2
问题转化为,先在N个元素的原集合S中选取K个元素作为交集,之后在剩下的N - K个元素的集合S'中选取若干子集使其交集为空。 前半部分的答案为C(N, K)。对后半部分,由容斥原理,其答案为 sum ({选取S'的若干子集使其交集至少包含i个元素的方案数} * (-1) ^ i) 。 而“选取若干子集使其交集至少包含i个元素的方案数”可以这样计算:首先任意选出一个含有i个元素的集合作为交集,然后在剩下的N - K - i个元素的集合的子集集合中任选一个非空子集。故其答案为C(N - K, i) * (2 ^ (2 ^ (n - K - i)) - 1)。
来源
蓝桥杯