世界真的很大
前几天做了一道容斥原理的题,发现并不怎么会这类东西,赶快找几道题写写
看了几篇题解不知所云
果然还是不简单,按自己理解写了过后发现过不了样例
发现还是考虑的不仔细,认真研究一波之后才马马虎虎地搞懂了一知半解
看题先:
description:
一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得
它们的交集的元素个数为K,求取法的方案数,答案模1000000007。(是质数喔~)
input:
一行两个整数N,K
output:
一行为答案。
不好意思之前的题解是口胡233
这道题并不是一个容斥原理那么简单,但是网上的题解都没有提到这一点。。。做了一点补充希望耐心看完
这道题他说“交集元素个数刚好为K”的方案数
那么就很容易想到容斥原理,即:
大于等于K的 - 大于等于K+1的 + 大于等于K+2的 and so on
那么现在的问题就在于求出来大于等于某个值的方案数
比如现在来找一下交集大于等于 i 的方案数
首先枚举交集i,即从n个里面选i个作为交集元素的方案数,这一步自然是 C(n,i)。
然后考虑整个集合还剩n-i个元素,剩余的子集个数就是2^(n-i)
现在我们相当于是给每一个剩下的子集添加这i个元素,这样他们的交集就至少为i了
然后剩下的每一个子集有选与不选,这样方案数就是2^(2^(n-i))
但是所有集合不能同时不选
也许会有疑问全都不选就选这i个不也是一种方案吗?
其实不然
全都不选等价于选了空集,而空集也是属于那2^(n-i)种子集的
全都不选即是说空集也不选,这当然是不合法的,所以要减一
即: 2^(2^(n-i))-1
然后这样算一下,写出来发现,过不了样例。。
样例3 2
那我们枚举的其实就是大于等于2的减去大于等于3的