原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2068
题意:有n个人,野骆驼(人名)只要认识一半以上就可以了。请问有多上组答案能使他过关。
思路:必须认识一半以上,也就是说他最多有一半个不认识的。所以是0~n/2的每一个错排产生的答案都满足题意。选取i(i=0,1,2,……,n/2)个人进行错排,由乘法原理可知
产生的答案组数为:C_n_m(n,i)*a[i];其中a[i]是错排数,把它们加起来就是所有的可以使他过关的答案数。
代码如下:
#include<stdio.h>
_int64 C_n_m(int n,int m)
{
int i;
_int64 x=1,y=1;
for(i=1;i<=m;i++)
x*=i;
for(i=n;i>n-m;i--)
y*=i;
return y/x;
}
int main()
{
int i,n;
_int64 sum,a[14]={1,0,1,2};
for(i=4;i<14;i++)
a[i]=(i-1)*(a[i-1]+a[i-2]);
while(scanf("%d",&n),n)
{
for(sum=0,i=0;i<=n/2;i++)
sum+=C_n_m(n,i)*a[i];
printf("%I64d\n",sum);
}
return 0;
}