點此看題面
對於這種恰好為\(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...