題意:給出有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 就是我們最終的所求.好,...