URAL 1903 Unidentified Ships 组合数

#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
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值