HDU 2068 RPG的错排

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=2068

题解:

1.首先,从n个女生中选出i个(i>=(n+1)/2,因为题目要求答对一半以上),为被答对的女生。有C(n,i)组。

2.其余女生错排,错排数位D(n-i)

错排公式

3.则答对i个女生的组合数为 D(n-i)*C(n,i)

可以遍历i,从(n+1)/2 到 n-1  求和,结果再加上i=n时的一种情况。(因为i=n时,D(0)无意义)

代码:

#include<stdio.h>
_int64 C(int n,int r)
{
	_int64 sum=1;
	for(int i=1;i<=r;i++)
	{
		sum=sum*(n+1-i)/i;
	}
	return sum;
}
int main()
{
	int i,n;
	_int64 D[15];
	D[1]=0;D[2]=1;
	for(i=3;i<=14;i++)
	{
		D[i]=(i-1)*(D[i-1]+D[i-2]);
	}
	while(scanf("%d",&n),n!=0)
	{
		_int64 res=0;
		for(i=(n+1)/2;i<n;i++)
		{
			res=res+C(n,i)*D[n-i];
		}
		printf("%I64d\n",res+1);
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值