BZOJ2839 集合計數 容斥 組合

2022-03-16 15:57:58 字數 948 閱讀 9123

題目描述

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

上式對嗎?顯然是不對的,以為它不僅統計了交集為k的而且統計了交集為k以上的。

所以我們要用容斥。

設g[i]為交集大於等於i的方案數,

那麼:

用文字解釋就是「任意取-g[1]+g[2]-g[3]...」;

注意一下的指數在處理的時候要%(mod-1)而不是mod(尤拉定理的推論)。

階乘和逆元預處理即可。

#include#include

#define ll long long

using

namespace

std;

const

int n=1e6+5,mod=1e9+7

;ll ans,n,k,fac[n],inv[n];

ll poww(ll x,ll y,ll z)

return

sum;

}ll c(ll x,ll y)

intmain()

inv[n]=poww(fac[n],mod-2

,mod);

for(ll i=n-1;i>=0;i--)

for(ll i=n-k;i>=0;i--)

(ans*=c(n,k))%=mod;

printf(

"%lld

",ans);

return0;

}

view code

BZOJ 2839 集合計數 廣義容斥

在乙個 n 個元素集合中的所有子集中選擇若干個,且交集大小為 k 的方案數.按照之前的套路,令 f k 表示欽定交集大小為 k 其餘隨便選的方案數.令 g k 表示交集恰好為 k 的方案數.則有 f k sum binomg k 反演得 g k sum 1 binomf i 而 f k binom2...

bzoj 2839 集合計數 容斥原理

因為要在n個裡面選k個,所以我們先列舉選的是哪 k 個,方案數為 c k 確定選哪k個之後就需要算出集合交集正為好這 k 個的方案數,考慮用容斥原理。我們還剩下 n k 個元素,交集至少為 k 的方案數為 2 相當於在僅有剩下 n k 個元素的集合裡隨便選,最後再往每個集合裡塞進這 k 個元素。然後...

bzoj2839 集合計數 容斥 組合

2839 集合計數time limit 10 sec memory limit 128 mb submit 523 solved 287 submit status discuss description 乙個有n個元素的集合有2 n個不同子集 包含空集 現在要在這2 n個集合中取出若干集合 至少乙...