一个有N个元素的集合有
2
N
2^{N}
2N个不同子集(包含空集),现在要在这
2
N
2^N
2N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为
K
K
K,求取法的方案数,答案模1000000007。
交集元素个数至少为
K
K
K的方案数好求,恰好元素个数为
K
K
K的方案数不好求。
设
f
[
k
]
f[k]
f[k]表示至少为
K
K
K的方案数,
g
[
k
]
g[k]
g[k]表示恰好为
K
K
K的方案数。
f
[
k
]
=
∑
i
=
k
n
C
i
k
∗
g
[
i
]
f[k]=\sum_{i=k}^{n}C_{i}^{k}*g[i]
f[k]=∑i=knCik∗g[i]。二项式反演一下,
g
[
k
]
=
∑
i
=
k
n
(
−
1
)
i
−
k
C
i
k
∗
f
[
i
]
g[k]=\sum_{i=k}^{n}(-1)^{i-k}C_{i}^{k}*f[i]
g[k]=∑i=kn(−1)i−kCik∗f[i]。
现在只需要考虑
f
f
f怎么求。
f
[
k
]
=
C
n
k
∗
(
2
2
n
−
k
−
1
)
f[k]=C_{n}^{k}*(2^{2^{n-k}}-1)
f[k]=Cnk∗(22n−k−1)。
2
2
n
−
k
2^{2^{n-k}}
22n−k不好直接求,根据欧拉定理的推论,把幂先模
φ
(
m
o
d
)
\varphi(mod)
φ(mod)即
m
o
d
−
1
mod-1
mod−1。
O
(
n
)
O(n)
O(n)预处理一下
f
f
f数组,
O
(
n
)
O(n)
O(n)求答案。