5098 - 子集选取

通过次数

0

提交次数

0

时间限制 : 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)。

来源

蓝桥杯提高