• 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;
    }
    
    
  • 相关阅读:
    js以字符串方式创建DOM(原生js,jquery,extjs)
    gallery3
    检测标准类型和内置对象类型
    js数据类型和类型检测
    gallery2
    gallery
    如何使用Git上传项目代码到github
    sublime EMMET
    模糊搜索
    导出表格
  • 原文地址:https://www.cnblogs.com/Yuzao/p/8438208.html
Copyright © 2020-2023  润新知