hdu 2049

来源:互联网 发布:ysl 口红 知乎 编辑:程序博客网 时间:2024/06/06 05:22

从d组里选出b组然后b组错排一下就好了

long long f[22];
long long s(int d,int b)
{
int i,j=1;
long long sum=1;
for(i=d;i>=d-b+1;i–)
{
sum=sum*i/j;
j++;
}
return sum;
}
int main()
{
int n,d,b,i;
f[1]=1;f[2]=1;f[3]=2;
for(i=4;i<=20;i++)
f[i]=(i-1)*(f[i-2]+f[i-1]);
scanf(“%d”,&n);
while(n–)
{
scanf(“%d %d”,&d,&b);
printf(“%lld\n”,f[b]*s(d,b));
}
return 0;
}

这题我还提交了好几次,一直输入数例结果是正确的还比较奇怪哪里错了,没有注意数字给爆了,之前提交的错误答案贴上,提醒自己

long long f[22],a[22];
int main()
{
int n,d,b,i,j;
f[1]=1;f[2]=1;f[3]=2;
a[0]=1;a[1]=1;a[2]=2;a[3]=6;
for(i=4;i<=20;i++)
{
f[i]=(i-1)*(f[i-2]+f[i-1]);
a[i]=i*a[i-1];
}
scanf(“%d”,&n);
while(n–)
{
scanf(“%d %d”,&d,&b);
printf(“%lld\n”,f[b]*a[d]/(a[b]*a[d-b]));//忽视了两个大数相乘超过了64位
}
return 0;
}

//忽视了两个大数相乘超过了64位