傳送門
看計數想容斥
考慮強制選 $k$ 個數作為子集,剩下數組成的集合隨便選幾個子集使得它們交集為空
顯然 $n$ 個數中強制選 $k$ 個數的方案數是 $c_^$
剩下的數構成的子集總數有 $2^$ 個,那麼如果沒有交集為空的限制方案數就是 $2^}-1$(注意要 $-1$,因為空集取和不取是一樣的)
那麼根據乘法原理顯然,交集元素個數至少為 $k$ 的方案數就是 $c_^ (2^}-1) $
設 $f_$ 表示交集元素個數至少為 $i$ 的方案數
根據容斥,剩下的數
交集為空的方案數就是 $f_-f_+f_-f_+...+(-1)^f_$
把交集為空的方案數乘上強制選 $k$ 個數作為子集的方案數 $c_^$ 就好了
注意到算 $f_$ 時要算 $2^}$ ,發現 $2^} = 2^} \cdot 2^}$
然後預處理階乘和階乘逆元就好了,具體看**
#include#include#include
#include
#include
using
namespace
std;
typedef
long
long
ll;inline
intread()
while(ch>='
0'&&ch<='
9')
return x*f;
}const
int n=1e6+7,mo=1e9+7
;int
n,k,ans;
ll fac[n],facinv[n],inv[n];
inline ll c(
int x,int y)
inline ll fk(ll x)
intmain()
ll now=2; n-=k;
for(int i=n;i>=0;i--)
printf(
"%lld
",ans*c(n+k,k)%mo);
return0;
}
bzoj 2839 集合計數
題意 乙個有n個元素的集合有2 n2 n 2n個不同子集 包含空集 現在要在這2 n2 n 2n個集合中取出若干集合 至少乙個 使得它們的交集的元素個數為k,求取法的方案數,答案模1000000007 題解 好題。一開始覺得應該很簡單,然而很快就證明了我很天真。設f k cn k i 12n kc2...
bzoj2839 集合計數
bzoj許可權題 離線題庫 首先,還是按照這類題目的套路分析 設函式 g x 表示交集至少大小為 x 的方案數 那麼先組合數算選取 x 個數的方法,再對剩下的 n x 個數算集合的集合 也就是集族咯 個數,可以得到 g x 的表示式 g x binom 2 1 那麼我們只要找到乙個容斥函式 f i ...
bzoj2839 集合計數
傳送門 分析 咕咕咕我的做法和這個部落格幾乎相同 只是我在處理 2 1 的時候是先處理前面的再處理後面的 所以前面的 2 我們只需要從 i n 開始迴圈,每次平方即可 include include include include include include include include in...