bzoj 3622: 已经没有什么好害怕的了

Description

题面

Solution

首先 \(ai>bi\) 的有 \(\frac{n+k}{2}\)
将a,b排序
\(f[i][j]\) 表示前\(i\)个,至少有\(j\)组满足(\(ai>bi\)) 的方案数
求出满足 \(a[i]>b[k]\) 的最大的\(k\)
\(f[i][j]=f[i-1][j]+f[i-1][j-1]*(k-(j-1))\)
最后容斥一下 \(ans=\sum_{i=k}^{n}(-1)^{i-k}*f[n][i]*c[i][k]*(n-i)!\)

#include<bits/stdc++.h>
using namespace std;
const int N=2010,mod=1e9+9;
int n,K,a[N],b[N],g[N],f[N][N],c[N][N],bin[N];
int main(){
  freopen("pp.in","r",stdin);
  freopen("pp.out","w",stdout);
  scanf("%d%d",&n,&K);
  if((n+K)&1)puts("0"),exit(0);
  else 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++)g[i]=lower_bound(b+1,b+n+1,a[i])-b-1;
  for(int i=0;i<=n;i++){
    f[i][0]=1;c[i][0]=1;
    for(int j=1;j<=i;j++)
      f[i][j]=(f[i-1][j]+1ll*f[i-1][j-1]*(g[i]-j+1))%mod,
	c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
  }
  int ans=0;
  bin[0]=1;for(int i=1;i<=n;i++)bin[i]=1ll*bin[i-1]*i%mod;
  for(int i=K;i<=n;i++)
    ans=(ans+1ll*((i-K)&1?-1:1)*f[n][i]*bin[n-i]%mod*c[i][K])%mod;
  if(ans<0)ans+=mod;
  cout<<ans<<endl;
  return 0;
}

posted @ 2018-02-10 10:26  PIPIBoss  阅读(172)  评论(5编辑  收藏  举报