#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
const int mod=1e9+7;
#define maxn 5055
#define LL __int64
int c[maxn];
int e[maxn][2600];
void init()
{
int i,j,k;
__int64 sum;
e[0][0]=1;
e[1][1]=e[1][0]=1;
for(i=2;i<=5000;i++)
{
e[i][0]=1;
for(j=1;j<=i/2;j++)
{
sum=e[i-1][min(j,i-1-j)];
sum=(sum+e[i-1][min(j-1,i-j)])%mod;
e[i][j]=sum;
}
}
/*for(i=1;i<=20;i++)
{
for(j=0;j<=i;j++)
cout<<e[i][min(j,i-j)]<<" ";
cout<<endl;
}*/
}
int main()
{
init();
int
n,t,k,x,y,z,pos;
while(scanf("%d%d",&n,&t)!=EOF)
{
int i,j,p,q;
for(i=0;i<n;i++)
scanf("%d",&c[i]);
/*for(i=0;i<1500;i++)
c[i]=1;
for(i=1500;i<3500;i++)
c[i]=2;
for(i=3500;i<5000;i++)
c[i]=3;*/
scanf("%d%d",&k,&pos);
x=y=z=0;
p=pos-1;
q=t-pos;
for(i=0;i<n;i++)
if(c[i]<c[k-1])
x++;
else if(c[i]>c[k-1])
y++;
else
z++;
z--;
//cout<<x<<" "<<y<<" "<<z<<endl;
__int64 ans=0,sum;
for(i=0;i<=z;i++)
{
if(i>q)
break;
if(q-i>y)
continue;
for(j=0;j<=z-i;j++)
{
if(j>p)
break;
if(p-j>x)
continue;
sum=(__int64)e[z][min(i+j,z-i-j)];
sum=(sum*e[y][min(q-i,y-q+i)])%mod;
sum=(sum*e[x][min(p-j,x-p+j)])%mod;
ans=(ans+sum)%mod;
}
}
printf("%I64d\n",ans);
}
return 0;
}
/*
8 5
1 1 2 2 3 4 5 6
5 3
18
5000 2500
1500个1,2000个2,1500个3
2500 1250
14243163
*/
URAL 1903 Unidentified Ships 组合数
最新推荐文章于 2020-01-07 23:46:34 发布