BZOJ2839 集合計數(廣義容斥)

2022-09-14 17:51:16 字數 927 閱讀 4426

點此看題面

對於這種恰好為\(k\)的顯然想到容斥,去設\(f_i\)為交集大小大於等於\(i\)的方案數,根據廣義容斥的式子就可以發現:

\[ans=\sum_^n(-1)^c_i^kf_i

\]於是只要考慮如何快速計算\(f_i\),首先有個選出\(i\)個數的方案數\(c_n^i\)。

那麼選出的所有集合都必須包含這\(i\)個數,剩下\(n-i\)個數可以任選,因此總共有\(2^\)個包含這\(i\)個數的集合。

然後我們可以在這些集合中選出至少乙個,最終得到:

\[f_i=c_n^i\times 2^}-1

\]此時已經可以\(o(logn)\)計算每個\(f_i\)了,但事實上我們可以發現:

\[2^}=2^\times 2}=(2^})^2

\]所以我們只要維護\(2^}\)並從大到小列舉\(i\),便可實現\(o(n)\)了。

#include#define tp template#define ts template#define reg register

#define ri reg int

#define con const

#define ci con int&

#define i inline

#define w while

#define n 1000000

#define x 1000000007

#define c(x,y) (1ll*fac[x]*ifac[y]%x*ifac[(x)-(y)]%x)//組合數

using namespace std;

int n,k,fac[n+5],ifac[n+5];

i int qp(ri x,ri y,ci p)

int main()

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 的方案數.按照之前的套路,令 f k 表示欽定交集大小為 k 其餘隨便選的方案數.令 g k 表示交集恰好為 k 的方案數.則有 f k sum binomg k 反演得 g k sum 1 binomf i 而 f k binom2...

bzoj 2839 集合計數

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