hdu 2049

从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位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值