您的位置:首页 > 其它

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

2014-11-30 11:51 267 查看

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'
[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
[i]=f
[i]*p[n-i]%mod;
for(j=i+1;j<=n;j++)
{
fx
[i]=fx
[i]-((fx
[j]*p[j]%mod)*px[j-i]%mod)*px[i]%mod;
while(fx
[i]<0)
fx
[i]+=mod;
}
}
printf("%lld\n",fx
[k]);
return 0;
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: