URAL 1903 Unidentified Ships 组合数

来源:互联网 发布:淘宝访客数公式 编辑:程序博客网 时间:2024/04/27 15:04
#include <stdio.h>#include <string.h>#include <algorithm>#include <iostream>using namespace std;const int mod=1e9+7;#define maxn 5055#define LL __int64int 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 51 1 2 2 3 4 5 65 3185000 25001500个1,2000个2,1500个32500 125014243163*/