恰好
k
组不好求,先求至少
首先把
a
,
fi,j=fi−1,j+fi−1,j−1∗(ti−j+1)
然后 Fi 即为 fn,i∗(n−i)! ,就是剩下的随意匹配。
那么有:
Fk=∑i=kn(ik)Gi
二项式反演就有:
Gk=∑i=kn(−1)i−k(ik)Fi
O(n2) 求即可。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int mod=1000000009;
int n,k,a[2010],b[2010],t[2010];
ll f[2010][2010],C[2010][2010],fac[2010];
int main()
{
scanf("%d%d",&n,&k);
k=n+k>>1;
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+n+1);
sort(b+1,b+n+1);
for(int i=1;i<=n;i++)
for(int j=(t[i]=t[i-1])+1;j<=n&&b[j]<a[i];j++,t[i]++);
for(int i=0;i<=n;C[i][0]=1,i++)
for(int j=1;j<=i;j++)
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
fac[0]=1;
for(int i=1;i<=n;i++)
fac[i]=fac[i-1]*i%mod;
for(int i=0;i<=n;i++) f[i][0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
f[i][j]=(f[i-1][j-1]*max((t[i]-j+1),0)+f[i-1][j])%mod;
ll ans=0;
for(int i=k,sgn=1;i<=n;i++,sgn=-sgn)
(ans+=(C[i][k]*f[n][i]%mod*fac[n-i]%mod*sgn+mod))%=mod;
printf("%lld",ans);
return 0;
}