傳送門
設\(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...