BZOJ 2839 集合計數 二項式反演

2022-05-12 09:34:33 字數 828 閱讀 5614

傳送門

設\(f(k)\)為交集元素個數為\(k\)的方案數。發現我們並不能直接求出\(f(k)\),就考慮容斥之類的東西,容斥首先要擴大限制,再設\(g(k)\)表示至少有\(k\)個交集的方案數。\(g(k)\)是特別好算的,可以強制\(k\)個元素必選,其餘的任意,那麼有

\[g(k)=\sum\limits_^n\dbinom(2^}-1)

\]用\(g\)來表示\(f\)可得

\[g(k)=\sum\limits_^n\dbinomf(i)

\]然後二項式反演可得

\[f(k)=\sum\limits_^n(-1)^\dbinomg(i)

\]這樣就可以算了。

但是注意剛開始預處理\(g\)陣列時,因為指數不能取模,所以不能直接算。需要把\(2^\)拆成\((2^})^2\)來算。

#include#include#include#include#includeusing namespace std;

const int n=1000005;

const int mod=1000000007;

typedef long long ll;

int n,k,g[n],ans,fac[n],inv[n];

inline int fast_pow(int x,int y)

return ret;

}inline int c(int x,int y)

int main()

for(int i=k;i<=n;i++)

printf("%d\n",ans);

return 0;

}

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