BZOJ 2839 集合計數

2022-05-19 11:07:50 字數 1073 閱讀 5068

傳送門

看計數想容斥

考慮強制選 $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...