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