题目:
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;
}