bzoj 2839 集合計數 排列組合 容斥原理

2021-08-08 22:06:50 字數 747 閱讀 1266

乙個有n個元素的集合有2^n個不同子集(包含空集),現在要在這2^n個集合中取出若干集合(至少乙個),使得它們的交集的元素個數為k,求取法的方案數,答案模1000000007。(是質數喔~)

n<=1000000

首先我們列舉交集元素,方案顯然為ck

n 。那麼我們選擇的集合則必然要包含這k個元素,顯然滿足條件的集合有2n

−k個,因為集合的數量不固定但不能為0,則選擇的方案有22

n−k−

1 種。但我們發現會有一些選擇方案使得交集包含另外的元素,於是就可以大力容斥一波。具體來說就是列舉另外包含的元素數量s,若s為偶數則答案加上22

n−k−

s−1 ,否則就減去即可。

#include

#include

#include

#include

#include

using namespace std;

typedef long long ll;

const int n=1000005;

const int mod=1000000007;

int n,k,jc[n],ny[n];

int ksm(int

x,int

y,int mo)

return ans;

}int c(int n,int

m)int get(int

s)int main()

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...