问题如下
Problem Description
ACM比赛剩下最后10分钟,其他人都已经收拾好东西准备走人,Zyj才从睡梦中醒来。Zyj可以看到所有其他人的过题情况,他希望得到的名次在a到b之间,问有几种可选择的方案?(假设其他人的提交时间即使加上罚时也早于Zyj的提交,毕竟剩下10分钟了都)
Input
第一行为T(0<T<100),代表有T组数据。
每组数据中第一行为两个数字m n a b,由空格隔开,代表这次比赛有m道题(由于字母数量的限制,0<m<27),n个其他人,Zyj希望得到的名次x满足a<x<b (-1<n,a,b<1000)
下面n行为每个人每道题的通过情况,1为已通过,0为未通过
Output
对每个样例,输出Case #k: ans,其中k为样例编号,ans为方案数量。
Sample Input
2
26 1 0 2
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
26 1 0 2
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
(Case #1是25个1 1个0,#2是1个0 24个1 1个0)
Sample Output
Case #1: 1
Case #2: 27
样例解释:
Case #1中Zyj必须AK(全部题都做出来)才可以得到大于0小于2的名次,即第1名。不要怕他做不完,那可是Zyj
Case #2中Zyj可以AK,也可以任意选一道不做
ACM排名规则见http://scnuacm2015.sinaapp.com/php/presentation.php
Author
SCNU20102200088
我的代码
#include
#include
int main()
{
long long int a,c,d,e,f,g,h,i,j,m,p,q,r,s;
scanf("%I64d",&r);
s=r;
while(r--)
{
scanf("%I64d%I64d%I64d%I64d",&a,&e,&h,&i);
long long int b[100000]={0};
b[0]=a;
f=e;
if(f!=0)
{
p=0;
while(e--)
{
for(c=0;c<a;c++)
{
scanf("%I64d",&d);
b[e+1]=b[e+1]+d;
}
}
for(c=1;c<f+1;c++)
for(e=1;e<f-c+1;e++)
{
if(b[e]<b[e+1])
{
g=b[e];
b[e]=b[e+1];
b[e+1]=g;
}
}
for(c=h;c<i-1;c++)
{
for(e=b[c+1]+1;e<=b[c];e++)
{
q=e;
m=1;
if(q>a/2)
q=a-q;
for(j=a-q+1;j<=a;j++)
m=m*j;
for(j=1;j<=q;j++)
m=m/j;
p=p+m;
}
if(c==f)
p++;
}
}
else
{
if(h==0)
p=pow(2,a);
else
p=0;
}
printf("Case #%d: ",s-r);
printf("%I64d\n",p);
}
return 0;
}
每次提交都WA不知如何是好