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

来源:互联网 发布:亳州市视频数据平台 编辑:程序博客网 时间:2024/04/28 11:03

Description

Input

Output

Sample Input

4 2
5 35 15 45
40 20 10 30

Sample Output

4

HINT


学姐走好_(:з」∠)_

容斥+DP

f[i][j]表示前i个有j对大于药片。剩下i-j对情况随意的种数

f[i][j]=f[i-1][j]+f[i-1][j-1]*(next[i]-j+1

然后去除重复的


然后f'[n][k]就是答案了
#include<cstdio>#include<algorithm>using namespace std;long long a[2001],b[2001];long long next[2001];long long f[2001][2001];long long fx[2001][2001];long long p[2001],px[2001];long long mod=1000000009;inline long long fpow(long long x,long long y){     long long ans=1;     while(y!=0)     {          if(y%2==1)               ans=ans*x%mod;          x=x*x%mod;          y=y/2;     }     return ans;}inline void pow(long long x){     long long i;     p[0]=1;     for(i=1;i<=x;i++)     {          p[i]=p[i-1]*i%mod;          px[i]=fpow(p[i],mod-2);     }}int main(){     int n,k;     scanf("%d%d",&n,&k);     if((n-k)%2==1) {      printf("0\n");  return 0; }     k=(n+k)/2;     long long i,j;     for(i=1;i<=n;i++)          scanf("%lld",&a[i]);     for(i=1;i<=n;i++)          scanf("%lld",&b[i]);     sort(a+1,a+1+n);     sort(b+1,b+1+n);     for(i=1;i<=n;i++)     {          for(j=next[i-1];j<=n;j++)          {               if(b[j]>a[i])               {                    next[i]=j-1;                    break;               }          }          if(j==n+1)               next[i]=n;     }     f[0][0]=1;     for(i=1;i<=n;i++)     {          for(j=0;j<=i;j++)          {               f[i][j]=f[i-1][j];               if(j>0&&next[i]-j+1>0)                    f[i][j]=(f[i][j]+f[i-1][j-1]*(next[i]-j+1)%mod)%mod;          }     }     pow(n);     for(i=n;i>=k;i--)     {      fx[n][i]=f[n][i]*p[n-i]%mod;          for(j=i+1;j<=n;j++)          {               fx[n][i]=fx[n][i]-((fx[n][j]*p[j]%mod)*px[j-i]%mod)*px[i]%mod;               while(fx[n][i]<0)                    fx[n][i]+=mod;          }     }     printf("%lld\n",fx[n][k]);     return 0;}




0 0
原创粉丝点击