bzoj2839 集合計數

2022-03-07 06:18:20 字數 1014 閱讀 5705

bzoj許可權題

離線題庫

首先,還是按照這類題目的套路分析

設函式$g(x)$表示交集至少大小為$x$的方案數

那麼先組合數算選取$x$個數的方法,再對剩下的$n-x$個數算集合的集合(也就是集族咯)個數,可以得到$g(x)$的表示式

$g(x)=\binom(2}-1)$

那麼我們只要找到乙個容斥函式$f(i)$,使得$\sum_^n f(i)g(i)=ans$就好了

我們考慮恰好出現了$i$次的情況,在上述公式中被計算的次數$t(i)$

顯然$t(x)=\sum_^x \binom f(i)$

考慮二項式反演

$f(x)=\sum_^x (-1)^ \binom t(i)$

然後因為我們最後要得到的是$ans$,那麼顯然$t(i)=[i==k]$

所以$f(x)=(-1)^ \binom

完美解決

代入原式得:

$ans=\sum_^n (-1)^ \binom \binom (2}-1)$

預處理後可以$o(n)$得出解

#include#include#include#include#include#include#define ll long long

#define mod 1000000007

using namespace std;

inline int read()

while(ch>='0'&&ch<='9') re=(re<<1)+(re<<3)+ch-'0',ch=getchar();

return re*flag;

}ll f[1000010],finv[1000010],ppow2[1000010],n,k;

ll qpow(ll a,ll b)

return re;

}void init()

ll c(ll x,ll y)

int main()

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

}

bzoj 2839 集合計數

題意 乙個有n個元素的集合有2 n2 n 2n個不同子集 包含空集 現在要在這2 n2 n 2n個集合中取出若干集合 至少乙個 使得它們的交集的元素個數為k,求取法的方案數,答案模1000000007 題解 好題。一開始覺得應該很簡單,然而很快就證明了我很天真。設f k cn k i 12n kc2...

bzoj2839 集合計數

傳送門 分析 咕咕咕我的做法和這個部落格幾乎相同 只是我在處理 2 1 的時候是先處理前面的再處理後面的 所以前面的 2 我們只需要從 i n 開始迴圈,每次平方即可 include include include include include include include include in...

bzoj2839 集合計數

考慮二項式反演。設 f i 表示交集至少為 i 的方案數,有 f i c n i 2 1 先選 i 必須包含,有 c n i 種選法。包含選出的 i 個元素的集合個數為 2 每個集合都可以選或不選,但是不能乙個也不選,所以方案數為 2 1 之後二項式反演就好了。code includeusing n...