bzoj 3622 容斥原理

2021-07-22 03:30:43 字數 1264 閱讀 7413

題意:給出有n個元素的集合a和集合b,所有2n個元素互不相同,求將a集合中的元素和b集合中的元素兩兩配對,使a的元素大於b中元素的對數恰為n+

k2對。設f

[i][

j]表示a中的前i個元素配對後至少有j對滿足a的元素大於b中元素。

那麼先將a和b排序,設ne

x[i]

表示b中最後乙個小於a中i元素的位置。然後dp一下。 f[

i][j

]=f[

i−1]

[j−1

]∗(n

ex[i

]−j+

1)+f

[i−1

][j]

這個方程沒有考慮a中除了這j對中元素之外的其他元素的配對方向。

那麼容斥一下,設g[

i]表示a中恰有i對滿足條件的方案數。 g[

i]=f

[n][

i]∗(

n−i)

!−∑n

j=i+

1g[j

]∗ci

j

#include 

using namespace std;

#define mod 1000000009

#define ll long long

#define n 2100

int n,k;

int a[n],b[n],nex[n],g[n],jc[n];

int f[n][n],c[n][n];

int main()

for(int i=1;i<=n;i++)scanf("%d",&a[i]);

for(int i=1;i<=n;i++)scanf("%d",&b[i]);

sort(a+1,a+1+n);sort(b+1,b+1+n);

jc[0]=1;

for(int i=1;i<=n;i++)jc[i]=(ll)jc[i-1]*i

%mod;

for(int i=0;i<=n;i++)c[i][0]=1;

for(int i=1;i<=n;i++)

for(int j=1;j<=i;j++)

c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;

for(int i=1,now=1;i<=n;i++)

int t=(n+k)/2;

for(int i=n;i>=t;i--)

printf("%d\n",g[t]);

return

0;}

容斥原理 數論

兩個集合的容斥關係公式 a b a b a b a b 重合的部分 三個集合的容斥關係公式 a b c a b c a b b c c a a b c 最後可以推廣到n個集合,集合裡的元素為奇數則加,偶數減 hdu 4135 很簡單,直接求出所有的質因子,然後容斥解決 author crystal ...

容斥原理,反演

大概知道為什麼自己水平比較渣啦。一開始只會反演,然後被容斥驚豔到。然後寫了一段時間容斥,反演忘光光。所以融會貫通真的很難。多校的三道題,當時是用反演做的。事實上以前就知道容斥跟莫比烏斯函式值的關係,然後熟練掌握 然後一段時間沒用就忘了哈。簡單來說就是,求乙個數和乙個集合中的數互質的個數,把集合中乙個...

關於容斥原理

容斥原理大概是這樣的,以長方體體積並為例,我們需要用容斥原理容斥出若干個長方體體積的並.首先,我們將每個長方體標號為1 n,那麼這些長方體的取捨顯然可以表示為乙個二進位制的數字s.設f s 表示長方體取捨狀態為s時,長方體的體積並,於是我們可以知道f 111111 有n個1 就是我們最終的所求.好,...